Search code examples
pythondjangoformsviewuser-registration

Django - Simple User Register not working [Not saving to DB]


I have simple user registration page, but its not saving to the database.

Issue: Register form displays, upon clicking submit button, doesn't do anything! Stays there (it should show a HttpResponse('User Registered') And save to db

I've know I'm missing something, but what? ideas please.

Views.py

from django.shortcuts import render


from django.views.generic import CreateView

from website.forms import RegisterUserForm

from django.http import HttpResponseForbidden
# Create your views here.
class RegisterUserView(CreateView):
    form_class = RegisterUserForm
    template_name = "account/register.html"

    #  Overide dispatch func - check if the user is authenticated or return forbidden
    def dispatch(self, request, *args, **kwargs):
        if request.user.is_authenticated():
            return HttpResponseForbidden()

        return super(RegisterUserView, self).dispatch(request, *args, **kwargs)

    # Overide form valid method behaviour
    def form_valid(self, form):
        #  False commit - don't save to db, locally cleaning users password first
        user = form.save(commit=False)
        user.set_password(form.cleaned_data['password'])
        user.save();
        # Change to redirect - later one! 
        return HttpResponse('User Registered')

def Home(request):
    return render(request, 'account/home.html')

Register.html

    {% extends 'base.html' %}

{%  block title %}
Register
{% endblock %}

{% block head %}
    {% load static %}
    <link href="{% static 'forms.css' %}" rel="stylesheet">
{%  endblock %}
{% block heading %}
    <h1>Register</h1>
{% endblock %}

{% block body %}
        <div class="bg-contact2" style="background-image: url('images/bg-01.jpg');">
        <div class="container-contact2">
            <div class="wrap-contact2">
                <form class="contact2-form validate-form">
                    <span class="contact2-form-title">
                        <h2> Teacher's Register </h2> 
                    </span>

                        {% csrf_token %}
                                {{ form.as_p }}


                    <div class="container-contact2-form-btn">
                        <div class="wrap-contact2-form-btn">
                            <div class="contact2-form-bgbtn"></div>
                            <button class="contact2-form-btn">
                                Send Your Message
                            </button>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </div>
<!-- 
    <h2>FORM</h2>
    <form action="{% url 'register' %}" class="contact2-form validate-form" method="post ">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="Register">
    </form> -->
{% endblock %}

forms.py

    from django import forms

from django.contrib.auth.models import User

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

    class Meta:
        # Connect to the user model and select which fields we want input for user model
        model = User
        fields = ['username', 'email']


    # Validate password matched / and clean them
    def clean_password2(self):
        cd = self.cleaned_data

        if cd['password2'] != cd['password']:
            raise ValidationError("Password don't match")
        return cd['password2']

Solution

  • I think you are missing the type in your button tag:

    <form method="POST">
        <span class="contact2-form-title">
            <h2> Teacher's Register </h2> 
        </span>
        {% csrf_token %}
        {{ form.as_p }}
        <div class="container-contact2-form-btn">
            <div class="wrap-contact2-form-btn">
                <div class="contact2-form-bgbtn"></div>
                    <button type="submit" class="contact2-form-btn">
                        Send Your Message
                    </button>
            </div>
        </div>
    </form>