如何在django用户admin中创建电子邮件字段

Lar*_*ell 3 django django-admin

我想在用户admin添加和更改页面中创建所需的电子邮件字段.我读过这篇文章:Django用户模型电子邮件字段:如何使其成为强制性的,我这样做了:

class MyUserCreationForm(UserCreationForm):
    def __init__(self, *args, **kwargs):
        super(MyUserCreationForm, self).__init__(*args, **kwargs)
        # make user email field required
        self.fields['email'].required = True

class UserAdmin(BaseUserAdmin):
    form = MyUserCreationForm
    add_form = MyUserCreationForm
    add_fieldsets = ((None, {'fields': ('username', 'email',
'password1', 'password2'), 'classes': ('wide',)}),)

admin.site.unregister(User)
admin.site.register(User, UserAdmin)
Run Code Online (Sandbox Code Playgroud)

这在添加用户时工作正常,但在更改用户时,我得到密码字段中显示的用户加密密码,而不是您通常看到的:

algorithm: pbkdf2_sha256 iterations: 24000 salt: ****** hash:
**************************************
Raw passwords are not stored, so there is no way to see this user's
password, but you can change the password using this form.
Run Code Online (Sandbox Code Playgroud)

当我尝试从更改屏幕保存时,它会显示"请更正以下错误".即使没有显示错误.

如何在更改表单中修复这些问题?

tri*_*ixn 12

看看UserAdmin源代码.

该UserAdmin使用UserChangeForm,因为它的form属性和UserCreationForm它的add_form属性.但是你已经使用派生的类覆盖了它们,UserCreationForm对于创建视图是可以的,但是对于更新视图不​​起作用.

from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django.contrib.auth.models import User

class EmailRequiredMixin(object):
    def __init__(self, *args, **kwargs):
        super(EmailRequiredMixin, self).__init__(*args, **kwargs)
        # make user email field required
        self.fields['email'].required = True


class MyUserCreationForm(EmailRequiredMixin, UserCreationForm):
    pass


class MyUserChangeForm(EmailRequiredMixin, UserChangeForm):
    pass


class EmailRequiredUserAdmin(UserAdmin):
    form = MyUserChangeForm
    add_form = MyUserCreationForm
    add_fieldsets = ((None, {
        'fields': ('username', 'email', 'password1', 'password2'), 
        'classes': ('wide',)
    }),)

admin.site.unregister(User)
admin.site.register(User, EmailRequiredUserAdmin)
Run Code Online (Sandbox Code Playgroud)

这应该可以解决问题.