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

Django Admin全权限staff用户部分应用不显示问题排查

Django Admin 非超管全权限用户不显示指定应用排查指南

问题复现条件

  • 超级用户登录后台所有功能访问正常
  • 已勾选全部权限的staff用户登录后,Garagem等部分应用不在侧边栏展示
  • 已确认代码未使用权限类装饰器、代理模型、自定义Admin模板,也未重写has_perm/has_module_perms方法
  • 参考凭证:

高概率根因

90%以上同类问题都是Contenttype表残留脏数据,导致界面上勾选的权限没有关联到真实存在的模型,非超管用户拿不到对应应用的有效权限,Django Admin自动隐藏了无权限访问的应用入口。
你当前贴出的GaragemConfig仅配置了name属性,没有显式指定verbose_name或自定义label,本身不会导致权限问题,但如果项目迭代中曾调整过garagem应用的目录位置、修改过模型类名、手动在数据库中批量插入过权限记录,就会出现权限关联失效的问题。

分步调试&修复方案

1. 快速定位问题层级

用出问题的staff账号登录后,直接在地址栏输入Garagem应用模型的直链,例如https://你的域名/admin/garagem/veiculo/,根据返回结果判断问题类型:

  • 返回403 Forbidden:属于权限校验拦截,用户确实没有访问权限
  • 返回404 Not Found:属于应用/路由注册异常(超级用户可正常访问时该情况概率极低)
  • 能正常打开列表页:属于侧边栏应用列表渲染逻辑异常,权限本身正常

2. 校验用户实际有效权限

不要相信后台权限勾选界面的显示,打开Django Shell执行以下命令,校验用户实际持有的权限:

python manage.py shell
from django.contrib.auth import get_user_model
User = get_user_model()
# 替换为出问题的staff账号用户名
staff_user = User.objects.get(username="替换为实际用户名")

# 打印用户所有生效权限
print("用户持有全部权限:", staff_user.get_all_permissions())
# 校验garagem应用的模块访问权限
print("garagem模块权限校验结果:", staff_user.has_module_perms("garagem"))
# 校验garagem下两个核心模型的查看权限
print("Veiculo模型查看权限:", staff_user.has_perm("garagem.view_veiculo"))
print("Retirada模型查看权限:", staff_user.has_perm("garagem.view_retirada"))

根据输出结果判断:

  • 如果has_module_perms返回False:说明用户确实没有拿到garagem下任何模型的有效权限,界面勾选的权限是关联到无效contenttype的脏数据
  • 如果has_module_perms返回True但侧边栏不显示应用:说明有自定义逻辑拦截了Admin的应用列表渲染

3. 清理脏数据修复权限

如果校验确认是权限关联失效,按以下步骤修复:

  1. 先对数据库做全量备份
  2. 执行迁移确保模型结构和数据库一致:
python manage.py makemigrations
python manage.py migrate
  1. 回到Django Shell执行清理逻辑,删除无效的contenttype和残留权限,重新生成默认权限:
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Permission
from django.contrib.auth.management import create_permissions
from django.apps import apps

# 清理所有不对应真实模型的无效contenttype和关联权限
for ct in ContentType.objects.all():
    model_cls = ct.model_class()
    if not model_cls:
        Permission.objects.filter(content_type=ct).delete()
        ct.delete()

# 为所有已注册应用重新生成默认增删改查权限
for app_conf in apps.get_app_configs():
    create_permissions(app_conf, verbosity=0)
  1. 回到Admin后台,重新给对应staff用户勾选Garagem应用的所有权限,退出账号重新登录验证。

4. 易遗漏的拦截点排查

如果清理权限后问题仍存在,逐一检查以下位置:

  • 全局Admin站点配置:检查是否有代码重写了AdminSite.get_app_list方法,该方法直接控制侧边栏展示的应用列表,可能存在过滤逻辑
  • 模型Meta配置:检查garagem下Veiculo、Retirada两个模型的Meta类,是否配置了default_permissions = ()关闭了默认权限,或app_label属性大小写/名称与注册的应用名不一致
  • 认证后端配置:确认AUTHENTICATION_BACKENDS配置没有被其他配置文件动态覆盖,没有加入自定义的权限拦截逻辑
  • 中间件逻辑:检查自定义中间件中是否存在针对非超管用户的路径过滤,拦截了garagem相关的Admin请求
  • App配置:确认GaragemConfig中没有自定义label属性导致app_label与权限名不匹配。

代码优化提示

你当前garagem/admin.py中FilterRetiradaAdmin.get_form方法内直接通过request.user.is_superuser判断用户身份给字段赋初始值,该逻辑本身不影响权限校验,但后续如果要加权限控制,建议使用Django Admin标准的has_view_permission/has_change_permission/has_add_permission方法实现,避免出现权限判断逻辑不一致的问题。


内容的提问来源于stack exchange,提问作者Antonio Nazareth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 12:18:24