You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 02:57:51