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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 03:16:02