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

如何为用户组分配基于AbstractUser的自定义用户模型权限?

问题分析与解决方案

你的问题核心是:自定义继承AbstractUser的CustomAbstractUser模型,通过代码为用户组分配该模型权限时无效果,但后台管理界面操作正常,且其他模型无此问题(模型分属不同应用)。

可能的原因及排查步骤

  1. 检查view_user变量是否定义
    你的代码中使用了view_user但未展示其获取逻辑,如果该变量未定义,代码会抛出异常导致后续权限分配操作终止。补充对应的权限获取代码:

    view_user = Permission.objects.get(codename="view_customabstractuser", content_type=content_type)
    
  2. 验证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和权限)。

  3. 检查模型是否为抽象模型
    确保CustomAbstractUser未设置abstract = True,抽象模型不会生成数据库表和对应的权限,后台管理界面也不会显示该模型的权限选项(与你描述的后台操作正常矛盾,可快速排除)。

  4. 尝试使用add()方法替代set()
    部分场景下,set()方法可能因事务或缓存问题未生效,改用add()方法测试:

    admin.permissions.add(add_user, change_user, view_user)
    
  5. 验证数据库权限记录
    直接查询数据库确认权限是否存在,以及分配是否生效:

    -- 确认目标权限存在
    SELECT * FROM auth_permission WHERE codename LIKE '%customabstractuser';
    -- 确认组权限关联记录
    SELECT * FROM auth_group_permissions WHERE group_id = (SELECT id FROM auth_group WHERE name = 'AdminUser');
    
  6. 检查事务与代码执行环境
    如果代码在事务块(如atomic()装饰器)中执行,需确保事务已提交;如果在Django Shell中执行,避免因未提交事务导致记录未写入数据库。

关键注意点

  • 确保CustomAbstractUser所在应用已执行过makemigrations和migrate,权限是在迁移时自动生成的。
  • 如果设置了AUTH_USER_MODEL = "你的应用.CustomAbstractUser",Django生成的权限codename仍基于模型类名小写(即add_customabstractuser),无需额外修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:22:45