我正在尝试覆盖Django UserAdmin模型的某些行为。特别是,我想对非超级用户隐藏“超级用户”字段。
所以,我的方法是这样的:
class ModelAdmin(BaseModelAdmin):
"Encapsulates all admin options and functionality for a given model."
# ...
def has_change_permission(self, request, obj=None):
"""
Returns True if the given request has permission to change the given
Django model instance.
If `obj` is None, this should return True if the given request has
permission to change *any* object of the given type.
"""
opts = self.opts
return request.user.has_perm(opts.app_label + '.' + opts.get_change_permission())
#...
根据我在ModelAdmin中找到的内容
class UserAdmin(UserAdmin):
"""
... my customised UserAdmin
"""
# adding a new method
def is_superuser(self, request):
"Returns True if the given user is a superuser."
return request.user.is_superuser
# then elsewhere 'hopefully' show a slightly different fieldset
# the following, of course, doesn't work.
fieldsets = (
(None, {
'fields': (
("first_name", "last_name"),
("email", "password"),
"is_staff",
"is_active",
"is_superuser" if self.is_superuser() else None
)
}),
('Groups', {
'fields': (
'groups',
)
}),
('Meta', {
'classes': ('collapse',),
'fields': (
'username',
"last_login",
"date_joined"
)
})
)
因此,我的问题是:
如何在新的自定义UserAdmin类中创建一个
def
,例如上面的类,以及如何调用它? (我怎么知道我何时处于正确的环境中)第2部分(奖金):如上面的伪代码所建议的,我如何简洁地在表单中包含/排除“ is_superuser”字段?
谢谢大家!
〜达里尔
谢谢
最佳答案
如果只想禁止用户将自己提升为超级用户,请覆盖YourUserAdmin.get_readonly_fields():
class YourUserAdmin(admin.ModelAdmin):
...
def get_readonly_fields(self, request, obj=None):
if request.user.is_superuser:
return None
try:
return self.readonly_fields + ('is_superuser',)
except:
return ('is_superuser',)
您必须注销默认的User / UserAdmin,然后再注册自己的。
admin.site.unregister(User)
admin.site.register(User, YourUserAdmin)
但是,管理员的ZEN表示:
Django管理员的核心是针对单个活动而设计的:受信任的用户编辑结构化内容。
如果用户不受信任,则不要授予他编辑权限来编辑用户帐户(期限)。即使您隐藏了超级管理员选项和“按超级管理员状态过滤”过滤器,他也可以更改您的密码并以您的身份登录。因此,如果您需要一些不受信任的用户来编辑用户帐户,请忘记管理员并编写您自己的哑接口。