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

Django继承AbstractUser创建超级用户缺少username/email参数报错如何解决

错误原因

Django 自定义用户模型的规则如下:

  1. USERNAME_FIELD 用于指定作为唯一登录凭证的字段,执行createsuperuser命令时,系统只会自动提示输入该字段和密码两个信息
  2. 其余你在模型中设置了null=False的必填字段,必须手动添加到REQUIRED_FIELDS列表中,才会在创建超级用户时触发输入提示,否则就会报「缺失必填参数」的错误,和你遇到的报错完全吻合:
    • 当USERNAME_FIELD = 'email'时,REQUIRED_FIELDS为空,系统不会提示输入username,但你的username字段设置了null=False,因此报错缺少username参数
    • 当USERNAME_FIELD = 'username'时,REQUIRED_FIELDS为空,系统不会提示输入email,但你的email字段设置了null=False,因此报错缺少email参数

另外你代码中自行定义的password字段存在严重问题:AbstractUser已经内置了加密密码存储字段,你自定义的password字段max_length=15远小于哈希后密码的长度,会导致密码存储失败,必须删除该自定义字段。

解决方案

按你的使用需求二选一即可:

方案1:用邮箱作为唯一登录标识(对应初始USERNAME_FIELD = 'email'的需求)

修改后的模型代码如下:

class CustomUser(AbstractUser):
    email = models.EmailField(max_length=250, null=False, unique=True)
    name = models.CharField(max_length=50, null=False)
    username = models.CharField(max_length=50, null=False)

    USERNAME_FIELD = 'email'
    # 把除了邮箱和密码之外的必填字段都加入列表
    REQUIRED_FIELDS = ['username', 'name']

方案2:用用户名作为唯一登录标识(对应USERNAME_FIELD = 'username'的需求)

修改后的模型代码如下:

class CustomUser(AbstractUser):
    email = models.EmailField(max_length=250, null=False, unique=True)
    name = models.CharField(max_length=50, null=False)
    username = models.CharField(max_length=50, null=False)

    USERNAME_FIELD = 'username'
    # 把除了用户名和密码之外的必填字段都加入列表
    REQUIRED_FIELDS = ['email', 'name']

后续操作

修改完模型代码后:

  • 如果还没生成过用户模型的迁移文件,直接执行python manage.py makemigrations和python manage.py migrate即可
  • 如果之前已经生成过迁移文件,需要先删除对应app下migrations目录里除了__init__.py之外的所有文件,再重新执行上述迁移命令,避免旧的字段约束残留生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:57:03