Django自定义用户模型创建超级用户报错:缺少username参数
解决Django自定义用户模型创建超级用户时的username参数缺失错误
问题根源
你继承了AbstractUser但遗漏了两个关键设置:
- 没有在User模型中关联自定义的
UserManager AbstractUser默认自带username字段,即便你把USERNAME_FIELD设为email,Django命令行工具仍会默认尝试传递username参数给create_superuser方法,而你的自定义管理器未处理该参数
修复步骤
1. 修改models.py文件
需要做两处核心修改:
- 添加
objects = UserManager(),让模型使用自定义的用户管理器 - 覆盖
username字段,将其设为非必填状态(避免与email作为唯一标识冲突)
修改后的完整代码:
from django.contrib.auth.models import AbstractUser from django.db import models import uuid from .manager import UserManager # 确保导入你的自定义管理器 class User(AbstractUser): """ Abstract User of django auth user model. """ # 覆盖username字段,设为空白且允许为空 username = models.CharField(max_length=150, unique=True, blank=True, null=True) uuid = models.UUIDField(default=uuid.uuid4, unique=True, null=False) email = models.EmailField(_("email address"), unique=True) middle_name = models.CharField(max_length=120, blank=True) image = models.ImageField(upload_to='user_profile/', blank=True) department = models.CharField(blank=True, choices=Department.choices, max_length=2) designation = models.CharField(max_length=120, blank=True) last_logout = models.DateTimeField(null=True) is_superuser = models.BooleanField(default=False) view = models.TextField(blank=True) USERNAME_FIELD = 'email' REQUIRED_FIELDS = [] # 关键:绑定自定义用户管理器 objects = UserManager()
2. 更新数据库迁移
执行以下命令同步模型修改到数据库:
python manage.py makemigrations python manage.py migrate
3. 重新创建超级用户
现在执行创建命令时,只会提示输入邮箱和密码,不会再要求username:
python manage.py createsuperuser
额外说明
如果想完全剔除username字段,也可以选择继承AbstractBaseUser而非AbstractUser,这种方式能完全自定义字段结构,但需要手动实现is_staff、is_active等权限相关字段。当前场景下,继承AbstractUser并覆盖username是更轻量化的解决方案。
内容的提问来源于stack exchange,提问作者Dhruvin Kalathiya
相关产品推荐
相关产品推荐

