【发布时间】:2012-11-19 15:45:19
【问题描述】:
我创建了一个自定义用户模型,并在我的应用程序中成功使用。
问题是在管理员中,在用户编辑屏幕上,我得到了当前密码哈希的显示,而不是用于设置密码的非常有用的界面。
我在 Python 2.7 上使用 Django 1.5b1。
为了管理用户界面,我怎样才能说服 Django 管理员像对待本地用户一样对待我的用户模型?
【问题讨论】:
标签: python django django-admin django-1.5
我创建了一个自定义用户模型,并在我的应用程序中成功使用。
问题是在管理员中,在用户编辑屏幕上,我得到了当前密码哈希的显示,而不是用于设置密码的非常有用的界面。
我在 Python 2.7 上使用 Django 1.5b1。
为了管理用户界面,我怎样才能说服 Django 管理员像对待本地用户一样对待我的用户模型?
【问题讨论】:
标签: python django django-admin django-1.5
文档建议您需要向管理员注册自定义模型并定义一些方法,以便管理员界面与自定义用户模型一起使用。
您可能还必须为用户定义内置表单。
来自Custom users and django.contrib.admin
您还需要向管理员注册您的自定义用户模型。如果您的自定义用户模型扩展了 AbstractUser,您可以使用 Django 现有的 UserAdmin 类。但是,如果您的 User 模型扩展了 AbstractBaseUser,则需要定义一个自定义 ModelAdmin 类。
【讨论】:
只需将其添加到您的表单中:
password = ReadOnlyPasswordHashField(
label= ("Password"),
help_text= ("Raw passwords are not stored, so there is no way to see "
"this user's password, but you can change the password "
"using <a href=\"password/\">this form</a>."))
【讨论】:
至少在 1.10 中,我能够做到以下几点。比上面的简单。我把它放在 admin.py 中:
from django.contrib.auth.admin import UserAdmin
from django.contrib import admin
from myapp.models import MyUser
class MyUserAdmin(UserAdmin):
model = MyUser
fieldsets = UserAdmin.fieldsets + (
(None, {'fields': ('a_custom_field',)}),
)
admin.site.register(MyUser, MyUserAdmin)
【讨论】:
如果您要扩展 AbstractBaseUser,您将需要两个表单,一个创建表单和一个不带密码的更新表单,从 ModelForm 派生。
然后在 Admin 表单中,指定单独的创建和更新表单,以及相应的字段集:
class MyUserAdmin(UserAdmin):
# The forms to add and change user instances
form = UserChangeForm
add_form = UserCreationForm
fieldsets = (
(None, {'fields': ('email', 'first_name', 'last_name')}),
)
add_fieldsets = (
(None, {'fields': ('email', 'password', 'password2', 'first_name', 'last_name')}),
)
新用户的密码可以使用。在预定义的 django 表单中而不是在管理员中更改密码。
【讨论】: