如何为用户组分配基于AbstractUser的自定义用户模型权限?
问题分析与解决方案
你的问题核心是:自定义继承AbstractUser的CustomAbstractUser模型,通过代码为用户组分配该模型权限时无效果,但后台管理界面操作正常,且其他模型无此问题(模型分属不同应用)。
可能的原因及排查步骤
检查
view_user变量是否定义
你的代码中使用了view_user但未展示其获取逻辑,如果该变量未定义,代码会抛出异常导致后续权限分配操作终止。补充对应的权限获取代码:view_user = Permission.objects.get(codename="view_customabstractuser", content_type=content_type)验证ContentType与权限的正确性
打印content_type和权限对象,确认是否匹配目标模型:print(content_type) # 应输出类似 <ContentType: 你的应用名 | custom abstract user> print(add_user) # 应输出类似 <Permission: 你的应用名 | custom abstract user | Can add custom abstract user>如果输出不匹配,说明
get_for_model获取的ContentType错误,可能是模型的app_label设置有误,或者模型为抽象模型(抽象模型不会生成ContentType和权限)。检查模型是否为抽象模型
确保CustomAbstractUser未设置abstract = True,抽象模型不会生成数据库表和对应的权限,后台管理界面也不会显示该模型的权限选项(与你描述的后台操作正常矛盾,可快速排除)。尝试使用
add()方法替代set()
部分场景下,set()方法可能因事务或缓存问题未生效,改用add()方法测试:admin.permissions.add(add_user, change_user, view_user)验证数据库权限记录
直接查询数据库确认权限是否存在,以及分配是否生效:-- 确认目标权限存在 SELECT * FROM auth_permission WHERE codename LIKE '%customabstractuser'; -- 确认组权限关联记录 SELECT * FROM auth_group_permissions WHERE group_id = (SELECT id FROM auth_group WHERE name = 'AdminUser');检查事务与代码执行环境
如果代码在事务块(如atomic()装饰器)中执行,需确保事务已提交;如果在Django Shell中执行,避免因未提交事务导致记录未写入数据库。
关键注意点
- 确保
CustomAbstractUser所在应用已执行过makemigrations和migrate,权限是在迁移时自动生成的。 - 如果设置了
AUTH_USER_MODEL = "你的应用.CustomAbstractUser",Django生成的权限codename仍基于模型类名小写(即add_customabstractuser),无需额外修改。
内容的提问来源于stack exchange,提问作者parice02
相关产品推荐
相关产品推荐

