Django继承AbstractUser创建超级用户缺少username/email参数报错如何解决
错误原因
Django 自定义用户模型的规则如下:
USERNAME_FIELD用于指定作为唯一登录凭证的字段,执行createsuperuser命令时,系统只会自动提示输入该字段和密码两个信息- 其余你在模型中设置了
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
相关产品推荐
相关产品推荐

