Django create custom UserCreationForm Django create custom UserCreationForm python python

Django create custom UserCreationForm


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 UserCreationFormfrom django import formsfrom django.contrib.auth.models import Userclass 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


You have to override UserCreationForm.save() method:

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

http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/forms.py#L10


In django 1.10 this is what I wrote in admin.py to add first_name, email and last_name to the default django user creation form

from django.contrib.auth.admin import UserAdmin as BaseUserAdminfrom django.contrib import adminfrom django.contrib.auth.models import Group, User# first unregister the existing useradmin...admin.site.unregister(User)class UserAdmin(BaseUserAdmin):    # The forms to add and change user instances    # The fields to be used in displaying the User model.    # These override the definitions on the base UserAdmin    # that reference specific fields on auth.User.    list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff')    fieldsets = (    (None, {'fields': ('username', 'password')}),    ('Personal info', {'fields': ('first_name', 'last_name', 'email',)}),    ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),    ('Important dates', {'fields': ('last_login', 'date_joined')}),)    # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin    # overrides get_fieldsets to use this attribute when creating a user.    add_fieldsets = (    (None, {        'classes': ('wide',),        'fields': ('username', 'email', 'first_name', 'last_name', 'password1', 'password2')}),)    list_filter = ('is_staff', 'is_superuser', 'is_active', 'groups')    search_fields = ('username', 'first_name', 'last_name', 'email')    ordering = ('username',)    filter_horizontal = ('groups', 'user_permissions',)# Now register the new UserAdmin...admin.site.register(User, UserAdmin)