Django 管理员在 UserAdmin 中排除
Django admin exclude in UserAdmin
目前我有这个用户代理模型:
class UserProxy(User):
class Meta:
verbose_name = 'Staff'
verbose_name_plural = 'Staffs'
proxy = True
在管理员方面,我有如下管理员:
class StaffAdmin(UserAdmin):
def get_queryset(self, request):
qs = super(StaffAdmin, self).get_queryset(request)
return qs.filter(is_staff=True)
exclude = ('first_name', 'last_name',)
def save_model(self, request, obj, form, change):
if request.user.is_superuser:
obj.is_staff = True
obj.save()
admin.site.register(UserProxy, StaffAdmin)
当我进入管理它的任何形式的代理模型时 return 出现以下错误:
"Key 'first_name' not found in 'UserProxyForm'. Choices are:
date_joined, email, groups, is_active, is_staff, is_superuser,
last_login, password, user_permissions, username."
我觉得这很奇怪,我试图只排除 is_staff
现在它 return:
"Key 'is_staff' not found in 'UserProxyForm'. Choices are:
date_joined, email, first_name, groups, is_active, is_superuser,
last_login, last_name, password, user_permissions, username."
为什么会这样?代理模型不应该包含基本模型中的所有字段吗?
阅读完 django UserAdmin class https://github.com/django/django/blob/master/django/contrib/auth/admin.py#L45
似乎 UserAdmin 使用字段集而不使用排除,我将我的 StaffAdmin 重写为:
class StaffAdmin(UserAdmin):
def get_queryset(self, request):
qs = super(StaffAdmin, self).get_queryset(request)
return qs.filter(is_staff=True)
list_display = ('username', 'email', 'is_staff')
search_fields = ('username', 'email')
fieldsets = (
(None, {'fields': ('username', 'password')}),
(_('Personal info'), {'fields': ('email',)}),
(_('Permissions'), {
'fields': ('is_active', 'is_staff', 'is_superuser', 'groups'),
}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('username', 'email', 'password1', 'password2', ),
}),
)
def save_model(self, request, obj, form, change):
if request.user.is_superuser:
obj.is_staff = True
obj.save()
admin.site.register(UserProxy, StaffAdmin)
现在我可以定义哪些字段需要显示
目前我有这个用户代理模型:
class UserProxy(User):
class Meta:
verbose_name = 'Staff'
verbose_name_plural = 'Staffs'
proxy = True
在管理员方面,我有如下管理员:
class StaffAdmin(UserAdmin):
def get_queryset(self, request):
qs = super(StaffAdmin, self).get_queryset(request)
return qs.filter(is_staff=True)
exclude = ('first_name', 'last_name',)
def save_model(self, request, obj, form, change):
if request.user.is_superuser:
obj.is_staff = True
obj.save()
admin.site.register(UserProxy, StaffAdmin)
当我进入管理它的任何形式的代理模型时 return 出现以下错误:
"Key 'first_name' not found in 'UserProxyForm'. Choices are: date_joined, email, groups, is_active, is_staff, is_superuser, last_login, password, user_permissions, username."
我觉得这很奇怪,我试图只排除 is_staff
现在它 return:
"Key 'is_staff' not found in 'UserProxyForm'. Choices are: date_joined, email, first_name, groups, is_active, is_superuser, last_login, last_name, password, user_permissions, username."
为什么会这样?代理模型不应该包含基本模型中的所有字段吗?
阅读完 django UserAdmin class https://github.com/django/django/blob/master/django/contrib/auth/admin.py#L45
似乎 UserAdmin 使用字段集而不使用排除,我将我的 StaffAdmin 重写为:
class StaffAdmin(UserAdmin):
def get_queryset(self, request):
qs = super(StaffAdmin, self).get_queryset(request)
return qs.filter(is_staff=True)
list_display = ('username', 'email', 'is_staff')
search_fields = ('username', 'email')
fieldsets = (
(None, {'fields': ('username', 'password')}),
(_('Personal info'), {'fields': ('email',)}),
(_('Permissions'), {
'fields': ('is_active', 'is_staff', 'is_superuser', 'groups'),
}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('username', 'email', 'password1', 'password2', ),
}),
)
def save_model(self, request, obj, form, change):
if request.user.is_superuser:
obj.is_staff = True
obj.save()
admin.site.register(UserProxy, StaffAdmin)
现在我可以定义哪些字段需要显示