我试图扩展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字段(加上内联表单,两者都可以正常工作)。
我认为问题在于字段集,但我无法从文档中找出答案。
答案 0 :(得分: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)
答案 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')