如何让Django中的Staff用户无法查看超级用户?
解决Django Staff用户无法查看超级用户的问题
你的现有代码仅修改了用户编辑页面的字段展示规则,但没有控制用户列表的可见范围,所以Staff用户依然能看到所有用户。要实现隐藏超级用户的需求,需要在自定义的MyUserAdmin类中重写get_queryset方法,过滤掉超级用户数据。
修改后的完整代码如下:
from django.contrib import admin from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import 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') return [ (None, {'fields': ('email', 'password')}), ('Personal info', {'fields': ('first_name', 'last_name')}), ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}), ('Important dates', {'fields': ('last_login', 'date_joined')}), ('Contact info', {'fields': ('contact_no',)}) ] else: perm_fields = ('is_active','is_staff') return [ ('Creds', {'fields': ('username','password')}), ('Personal info', {'fields': ('first_name','last_name','email')}) ] # 新增:重写get_queryset控制列表可见范围 def get_queryset(self, request): qs = super().get_queryset(request) if request.user.is_superuser: # 超级用户可以查看所有用户 return qs # Staff用户仅能查看非超级用户 return qs.filter(is_superuser=False) admin.site.unregister(User) admin.site.register(User, MyUserAdmin)
关键说明:
get_queryset方法负责返回Admin列表页面展示的数据集。通过判断当前登录用户的权限,对数据集进行过滤:- 超级用户返回全部用户数据
- Staff用户只返回
is_superuser=False的用户,即隐藏所有超级用户
- 原有的
get_fieldsets逻辑保持不变,继续控制不同权限用户编辑页面的字段展示
内容的提问来源于stack exchange,提问作者Darshil Lakhani
相关产品推荐
相关产品推荐

