扩展Django的UserCreationForm

时间:2017-10-26 22:58:41

标签: python django python-3.x django-forms

我试图扩展Django的django.contrib.auth.forms.UserCreationForm以包含电子邮件和名称字段。我对UserChangeForm的类似扩展工作正常,但UserCreationForm仍然只显示默认用户名,密码1和密码2字段。我有什么想法我做错了吗?

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)

同样,AuthorChangeForm正确显示所有字段,但AuthorCreationForm仅显示用户名,密码1和密码2字段(加上内联表单,两者都可以正常工作)。

我认为问题在于字段集,但我无法从文档中找出答案。

2 个答案:

答案 0 :(得分:1)

我找到了解决方案。正如我所怀疑的那样,问题是现场集。事实证明,UserAdmin类继承了需要覆盖的两个字段集fieldsetsadd_fieldsets。我没有在文档中的任何地方看到过这种情况(也许我只是错过了它);我不得不通过源头挖掘才能找到它。顾名思义,添加新用户时会使用add_fieldsets。以下管理类按预期工作:

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)

答案 1 :(得分:0)

来自Django doc:

  

classUserCreationForm¶用于创建新用户的ModelForm。

     

它有三个字段:用户名(来自用户模型),密码1和   密码2。它验证password1和password2是否匹配,验证   密码使用validate_password(),并设置用户的密码   使用set_password()。

所以你似乎必须自己创建额外的字段:

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')