自定义用户已分配权限,但user.has_perm返回False的问题求助
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

