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

自定义用户已分配权限,但user.has_perm返回False的问题求助

解决Django自定义用户模型has_perm返回False的问题

我之前也踩过这个坑!你遇到的情况大概率是调用has_perm时没有带上应用标签(app label)前缀导致的,Django的权限系统要求权限名称必须是app_label.codename的格式,哪怕是自定义权限也得遵守这个规则。

先排查最可能的原因:权限名称格式错误

你创建权限时的codename是can_see_soru_list,但调用has_perm的时候,必须加上Soru模型所在应用的app标签,比如假设Soru在名为quiz的app里,正确的调用方式应该是:

user.has_perm("quiz.can_see_soru_list")  # 注意前面的app标签

而不是直接传can_see_soru_list,这是最容易忽略的点!

其他可能的排查方向

如果上面的方法没用,再检查下面几个点:

  • 确认自定义用户模型配置正确
    确保settings.py里已经正确设置了自定义用户模型:

    AUTH_USER_MODEL = "your_app_name.customUser"
    

    如果没设置,Django会默认使用内置的User模型,这时候你给自定义用户加的权限可能不会被正确识别。

  • 检查ContentType和app_label是否匹配
    你用ContentType.objects.get_for_model(Soru)来关联权限是对的,但要确认Soru模型的app_label是否正确。如果你的模型在自定义app里,默认app_label是文件夹名称,但如果模型里手动指定了app_label,要确保和实际一致:

    class Soru(models.Model):
        # ... 你的字段
        class Meta:
            app_label = "your_app_name"  # 如果有这个配置,要和实际app名一致
    
  • 刷新权限缓存
    有时候Django的权限缓存会出问题,试试重启服务器,或者在Django shell里执行以下命令刷新权限:

    from django.contrib.auth.models import Permission
    Permission.objects.all().refresh_from_db()
    
  • 在shell里调试验证
    可以先在shell里打印用户的所有权限,确认权限的完整名称:

    from your_app.models import customUser
    user = customUser.objects.get(id=你的用户ID)
    # 打印每个权限的完整格式
    for perm in user.user_permissions.all():
        print(f"权限完整名称:{perm.content_type.app_label}.{perm.codename}")
    

    然后用打印出来的完整名称去调用has_perm,看是否返回True。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:39:01