Search code examples
pythondjangodjango-authentication

Django create custom UserCreationForm


I enabled the user auth module in Django, however when I use UserCreationForm it only asks for username and the two password/password confirmation fields. I also want email and fullname fields, all set as required fields.

I've done this:

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

class RegisterForm(UserCreationForm):
    email = forms.EmailField(label = "Email")
    fullname = forms.CharField(label = "Full name")

    class Meta:
        model = User
        fields = ("username", "fullname", "email", )

Now the form shows the new fields but it doesn't save them to the database.

How can I fix this?


Solution

  • There is no such field called fullname in the User model.

    If you wish to store the name using the original model then you have to store it separately as a first name and last name.

    Edit: If you want just one field in the form and still use the original User model use the following:

    You can do something like this:

    from django.contrib.auth.forms import UserCreationForm
    from django import forms
    from django.contrib.auth.models import User
    
    class RegisterForm(UserCreationForm):
        email = forms.EmailField(label = "Email")
        fullname = forms.CharField(label = "First name")
    
        class Meta:
            model = User
            fields = ("username", "fullname", "email", )
    

    Now you have to do what manji has said and override the save method, however since the User model does not have a fullname field it should look like this:

    def save(self, commit=True):
            user = super(RegisterForm, self).save(commit=False)
            first_name, last_name = self.cleaned_data["fullname"].split()
            user.first_name = first_name
            user.last_name = last_name
            user.email = self.cleaned_data["email"]
            if commit:
                user.save()
            return user
    

    Note: You should add a clean method for the fullname field that will ensure that the fullname entered contains only two parts, the first name and last name, and that it has otherwise valid characters.

    Reference Source Code for the User Model:

    http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/models.py#L201