【问题标题】:Extendings Django's UserCreationForm扩展 Django 的 UserCreationForm
【发布时间】:2018-04-08 11:17:50
【问题描述】:

我正在尝试扩展 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 字段(加上内联表单,这两者都可以正常工作)。

我认为问题出在字段集上,但我无法从文档中弄清楚。

【问题讨论】:

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


    【解决方案1】:

    我想出了解决办法。正如我所怀疑的那样,问题在于字段集。事实证明,UserAdmin 类继承有两个需要重写的字段集,fieldsets 和add_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)
    

    【讨论】:

      【解决方案2】:

      来自 Django 文档:

      class UserCreationForm¶ 用于创建新用户的 ModelForm。

      它有三个字段:用户名(来自用户模型)、密码1和 密码2。它验证密码 1 和密码 2 匹配,验证 使用 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')
      

      【讨论】:

      • 同样的结果。我只得到用户名、密码 1、密码 2 字段和内联表单。没有名字、姓氏、电子邮件等。
      • 仍然没有运气,同样的结果。
      猜你喜欢
      • 2018-03-01
      • 1970-01-01
      • 2013-04-18
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 2012-06-13
      相关资源
      最近更新 更多