简体   繁体   中英

Extendings Django's UserCreationForm

I'm trying to extend Django's django.contrib.auth.forms.UserCreationForm to include email and name fields. My similar extension of the UserChangeForm works fine, but UserCreationForm still only shows the default username, password1, and password2 fields. Any ideas what I'm doing wrong?

forms.py

class AuthorCreation(UserCreationForm):

    class Meta:
        model = User
        fields = ('username',  'password1', 'password2',
                  'first_name', 'last_name', 'email', 'groups', 'is_staff')


class AuthorChange(UserChangeForm):

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name',
                  'email', 'password', 'groups', 'is_staff')

admin.py

class AuthorAdmin(UserAdmin):
    """Admin class for creating and managing Authors"""
    inlines = [AuthorInline]

    fieldsets = (
        (None, {
            'fields': ('username', ('first_name', 'last_name'),
                       'email', 'password', 'groups', 'is_staff')
        }),
    )

    class Media:
        css = {
            'all': [
                'css/codenotes-admin.css',
            ]
        }

    def get_form(self, request, obj=None, **kwargs):
        if obj is None:
            return forms.AuthorCreation
        else:
            return forms.AuthorChange


admin.site.unregister(User)
admin.site.register(User, AuthorAdmin)

Again, the AuthorChangeForm correctly displays all the fields, but AuthorCreationForm only displays the username, password1, and password2 fields (plus the inline forms, which works fine on both).

I assume the problem is with the fieldsets, but I can't figure it out from the docs.

I figured out the solution. The problem was, as I suspected, the fieldsets. It turns out that the UserAdmin class inherits has TWO fieldsets that need to be overridden, fieldsets and add_fieldsets . I didn't see this mentioned anywhere in the docs (maybe I just missed it); I had to dig through the source to find it. As the name suggests, add_fieldsets is used when adding a new user. The following admin class works as expected:

admin.py

class AuthorAdmin(UserAdmin):
    """Admin class for creating and managing Authors"""
    inlines = [AuthorInline]

    fieldsets = (
        (None, {
            'fields': ('username', ('first_name', 'last_name'),
                       'email', 'password', 'groups', 'is_staff')
        }),
    )
    add_fieldsets = (
        (None, {
            'fields': ('username', 'password1', 'password2',
                       ('first_name', 'last_name'),
                       'email', 'groups', 'is_staff'),
        }),
    )

    class Media:
        css = {
            'all': [
                'css/codenotes-admin.css',
            ]
        }

    def get_form(self, request, obj=None, **kwargs):
        if obj is None:
            return forms.AuthorCreation
        else:
            return forms.AuthorChange


admin.site.unregister(User)
admin.site.register(User, AuthorAdmin)

From the Django doc:

class UserCreationForm¶ A ModelForm for creating a new user.

It has three fields: username (from the user model), password1, and password2. It verifies that password1 and password2 match, validates the password using validate_password(), and sets the user's password using set_password().

So it seems you have to create the extra fields yourself like this:

class AuthorCreation(UserCreationForm):
    first_name = forms.CharField(required=True, label="First Name")
    ... etc ...

    class Meta:
        model = User
        fields = ('username',  'password1', 'password2',
                  'first_name', 'last_name', 'email', 'groups', 'is_staff')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM