Rachit Agarwal
Rachit Agarwal

Reputation: 57

Sign up View in Django with Bootsrap

I am a self learned programmer (beginner) trying to write a Signup Class Based View. Through some tutorials I have been able to write a code which as follows:

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from django.views import generic
from django.views.generic import View
from .forms import UserForm


class UserFormView (View):
form_class = UserForm
template_name = "signup.html"

#display signup blank form
def get(self, request):
    form = self.form_class(None)
    return render(request, self.template_name, {'form': form})


#process form data
def post(self, request):
    form = self.form_class(request.POST)

    if form.is_valid():

        user = form.save(commit=False)

        #cleaned (normalized) data
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        user.set_password(password)
        user.save()

        # Returns User objects if credentials are correct

        user = authenticate(username=username, password=password)

        if user is not None:
            login(request, user)
            return redirect("home")

    return render(request, self.template_name, {'form': form})

Here is the forms.py:

from django.contrib.auth.models import User
from django import forms


class UserForm (forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput)

class Meta:
    model = User

    fields = ['first_name', 'last_name', 'username', 'email', 'password' ]

Now, I have a signup.html page designed using bootstrap. I am now stuck how to integrate my views to the html page. Using {{ form }} in a plane html is working bt not in bootstrap designed page. Please help

signup.html:

<div class="container">
<div class="row">
<div class="col-xs-12 col-sm-8 col-md-6 col-sm-offset-2 col-md-offset-3" style="margin-top: 70px">
    <form role="form" method="post" action="">{% csrf_token %}
        <h2>Welcome to Artivism <small>Sign up</small></h2>
        <hr class="colorgraph" style="height: 7px; border-top: 0; background: grey; border-radius: 5px;">
        <div class="row">
            <div class="col-xs-12 col-sm-8 col-md-6">
            {% for field in form %}
                <div class="form-group">
                    <input type="text" name="first_name" id="first_name" class="form-control input-lg" placeholder="First Name" tabindex="1" value="{{User.first_name}}">
                </div>
            </div>
            <div class="col-xs-12 col-sm-6 col-md-6">
                <div class="form-group">
                    <input type="text" name="last_name" id="last_name" class="form-control input-lg" placeholder="Last Name" tabindex="2" value="{{User.last_name}}">
                </div>
            </div>
        </div>
        <div class="form-group">
            <input type="text" name="user name" id="user_name" class="form-control input-lg" placeholder="User Name" tabindex="3" value="{{User.username}}">
        </div>
        <div class="form-group">
            <input type="email" name="email" id="email" class="form-control input-lg" placeholder="Email Address" tabindex="4" value="{{User.email}}">
        </div>
        <div class="row">
            <div class="col-xs-12 col-sm-6 col-md-6">
                <div class="form-group">
                    <input type="password" name="password" id="password" class="form-control input-lg" placeholder="Password" tabindex="5" value="{{User.password}}">
                </div>
            </div>
        <span class="help-block">By clicking Sign Up, you agree to our Terms and that you have read our Data Use Policy, including our Cookie Use.</span>

        <hr class="colorgraph" style="height: 7px; border-top: 0; background: grey; border-radius: 5px;"">
        <div class="row">
            <div class="col-xs-12 col-md-6 col-md-offset-3"><input type="submit" value="Sign Up" class="btn btn-primary btn-block btn-lg"></div>
        </div>
    </form>
</div>

Upvotes: 1

Views: 226

Answers (1)

ettanany
ettanany

Reputation: 19816

Include the following form in your signup.html page and let me know if it works for you:

<form method="post" action="{% url 'signup' %}" class="form-horizontal">
    {% csrf_token %}
    {% for field in form %}
        <div class="form-group">
            <label class="col-sm-2 control-label" for="id_{{ field.name }}">{{ field.label }}</label>
            <div class="col-sm-10">
                <input class="form-control" type="{{ field.field.widget.input_type }}"
                   name="{{ field.name }}"
                   id="id_{{ field.name }}"
                   value="{{ field.value }}" >
            </div>
        </div>
    {% endfor %}
    <input type="submit" value="Sign Up" class="btn btn-primary pull-right">
</form>

In your case, the simple solution would be to replace your form inputs with the following ones (this should work if your form fields are ['first_name', 'last_name', 'username', 'email', 'password']):

<input type="text" name="first_name" id="id_first_name" class="form-control input-lg" placeholder="First Name" tabindex="1">

<input type="text" name="last_name" id="id_last_name" class="form-control input-lg" placeholder="Last Name" tabindex="2">

<input type="text" name="username" id="id_username" class="form-control input-lg" placeholder="Username" tabindex="3">

<input type="email" name="email" id="id_email" class="form-control input-lg" placeholder="Email Address" tabindex="4">

<input type="password" name="password" id="id_password" class="form-control input-lg" placeholder="Password" tabindex="5">

Upvotes: 1

Related Questions