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

Django如何让超级用户使用标准User模型、普通用户使用CustomUser模型

Django双用户身份逻辑实现方案

首先明确:Django确实仅支持全局配置唯一的AUTH_USER_MODEL参数,无法直接同时指定内置User和自定义CustomUser两个模型作为全局用户基准,你可以通过以下方案实现业务需求:

推荐方案:合并用户模型+分层认证逻辑

这个方案改动最小,适配Django原生生态,不会出现权限、关联字段等兼容问题

  • 调整你的CustomUser定义,继承Django内置的AbstractUser,天然保留用户名、密码、邮箱、超级用户标识等原生字段
  • 新增user_type枚举字段,用于区分「超级管理员」和「普通用户」两类身份
  • 针对普通用户的字段规则调整:将用户名、密码、邮箱字段设置为null=True, blank=True,满足普通用户无需填写这些字段的需求
  • 自定义认证后端,重写authenticate方法,按登录场景走不同校验逻辑:

    超级管理员登录(如后台登录入口):强制校验用户名、密码的有效性,完全复用Django原生密码校验逻辑,仅允许is_superuser=True的用户通过验证
    普通用户登录:跳过用户名、密码校验,走你自定义的无凭据身份认证逻辑即可

  • 针对Django Admin后台做适配,仅放行user_type为超级管理员且is_superuser=True的用户访问,避免普通用户进入后台

可选方案:多模型独立存储+认证路由

如果确实不想合并两个用户模型,可以通过自定义认证后端做请求路由,但会存在权限体系兼容、关联字段映射等额外适配成本,非必要不推荐:

  • 保留内置auth.User表专门存储超级用户,CustomUser表存储普通用户
  • 自定义认证后端,在authenticate方法中先判断登录场景:

    后台登录请求:直接查询auth.User表校验用户名密码,校验通过后返回对应User实例
    普通用户请求:查询CustomUser表,走自定义认证逻辑返回对应实例

  • 需要额外适配所有用到用户关联的场景,比如外键关联、权限校验等逻辑,需要自行处理两个用户模型的标识区分

内容的提问来源于stack exchange,提问作者Kyle Calica-St

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:36:03