Django Admin:Staff权限用户创建用户时隐藏Superuser选项
在Django Admin中移除创建管理员用户时的Superuser状态选项
如果你是拥有Staff权限且具备创建用户权限的管理员,希望在创建新用户时看不到Superuser状态选项,完全可以通过自定义UserAdmin类来实现这个需求。
实现步骤及代码
我们需要重写UserAdmin的get_fieldsets方法,根据当前登录用户的权限动态调整表单中显示的权限字段:
from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import User from django.contrib import admin # 先取消默认User模型的注册 admin.site.unregister(User) class MyUserAdmin(UserAdmin): def get_fieldsets(self, request, obj=None): # 创建新用户时,使用默认的添加字段集合 if not obj: return self.add_fieldsets # 根据当前登录用户的权限决定显示哪些权限字段 if request.user.is_superuser: # 超级用户可以看到所有权限相关字段 perm_fields = ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions') else: # 普通Staff用户只能看到指定的权限字段,隐藏Superuser相关选项 perm_fields = ('is_active', 'is_staff') # 返回自定义的字段集合 return [(None, {'fields': ('username', 'password')}), (('Personal info'), {'fields': ('first_name', 'last_name', 'email')}), (('Permissions'), {'fields': perm_fields}), (('Important dates'), {'fields': ('last_login', 'date_joined')})] # 注册自定义的UserAdmin admin.site.register(User, MyUserAdmin)
代码逻辑说明
- 首先我们取消了Django默认注册的
User模型,这样才能用自定义的MyUserAdmin替代它的管理逻辑。 get_fieldsets是Django Admin控制表单字段分组显示的核心方法,这里做了两个关键判断:- 当
obj=None(创建新用户的场景)时,直接使用默认的add_fieldsets,保证创建流程的基础逻辑不受影响。 - 根据当前登录用户是否为超级用户,动态生成权限字段集合:超级用户能看到所有权限选项,普通Staff用户则只能看到
is_active和is_staff,彻底隐藏了is_superuser以及用户组、权限分配的相关选项。
- 当
这样设置后,普通Staff管理员在创建用户时就不会看到Superuser状态的选项了,完全符合需求。
内容的提问来源于stack exchange,提问作者user14823468
相关产品推荐
相关产品推荐

