如何禁止Staff与Admin用户编辑Superuser的属性
解决方案
场景1:完全禁止Staff和Admin篡改任何Superuser的属性
在现有代码基础上,增加对目标用户是否为Superuser的判断,直接阻止非超级管理员修改超级管理员的敏感字段,甚至可以彻底禁用所有编辑权限:
修改后的Admin代码
def get_form(self, request, obj=None, **kwargs): form = super().get_form(request, obj, **kwargs) current_user = request.user disabled_fields = set() # 仅对非超级管理员做限制 if not current_user.is_superuser: # 编辑自身时禁用指定字段 if obj is not None and obj == current_user: disabled_fields |= {'staff', 'admin', 'user_permissions'} # 编辑超级管理员时,禁用所有敏感字段 elif obj is not None and obj.is_superuser: # 可根据需求添加更多要禁用的字段 disabled_fields |= {'staff', 'admin', 'user_permissions', 'is_superuser'} # 若要完全禁止修改Superuser,可直接禁用所有字段 # for field in form.base_fields: # form.base_fields[field].disabled = True # 应用禁用设置 for f in disabled_fields: if f in form.base_fields: form.base_fields[f].disabled = True return form
额外强化:从权限层面彻底阻止编辑
还可以重写has_change_permission方法,直接让Staff/Admin用户看不到Superuser的编辑入口:
def has_change_permission(self, request, obj=None): # 非超级管理员无权修改超级管理员 if obj is not None and obj.is_superuser and not request.user.is_superuser: return False return super().has_change_permission(request, obj)
场景2:仅允许编辑除自身及Superuser之外的用户的is_staff与is_admin字段
默认禁用非超级管理员修改is_staff和is_admin的权限,仅当编辑对象是「非自身、非Superuser」的普通用户时,才放开这两个字段的编辑权限:
修改后的Admin代码
def get_form(self, request, obj=None, **kwargs): form = super().get_form(request, obj, **kwargs) current_user = request.user # 仅对非超级管理员做限制 if not current_user.is_superuser: # 默认禁用staff和admin字段 disabled_fields = {'staff', 'admin'} # 仅当编辑对象不是自己、也不是超级管理员时,启用这两个字段 if obj is not None and obj != current_user and not obj.is_superuser: disabled_fields -= {'staff', 'admin'} # 编辑自身时额外禁用user_permissions if obj is not None and obj == current_user: disabled_fields.add('user_permissions') # 应用禁用设置 for f in disabled_fields: if f in form.base_fields: form.base_fields[f].disabled = True return form
内容的提问来源于stack exchange,提问作者betty_
相关产品推荐
相关产品推荐

