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

Django中用邮箱替代用户名创建超级用户报错求助

问题排查与解决方案

错误原因

你遇到的TypeError是因为自定义的CustomUserManager中create_superuser方法的参数定义和Django默认逻辑不匹配——当把USERNAME_FIELD设为email后,createsuperuser命令会将email作为核心标识传递,而你的manager方法仍在期望username参数。

正确的代码实现

1. 自定义UserManager

确保重写的create_user和create_superuser方法不再依赖username,以email作为核心字段:

from django.contrib.auth.models import BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('The Email field must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self.create_user(email, password, **extra_fields)

2. 自定义User模型

设置USERNAME_FIELD为email,并明确REQUIRED_FIELDS为空(因为email已作为登录字段默认必填),同时处理username字段:

from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from django.db import models
from .managers import CustomUserManager

class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    username = models.CharField(max_length=150, null=True, blank=True)  # 保留可空的username
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []  # 不需要额外必填字段,email已作为USERNAME_FIELD

    def __str__(self):
        return self.email

3. 关键配置与迁移

  • 确保settings.py中已正确设置:
    AUTH_USER_MODEL = 'users_auth.CustomUser'
    
  • 删除旧的迁移文件(如果之前生成过基于默认User模型的迁移),重新生成并执行迁移:
    rm -rf users_auth/migrations/  # 谨慎操作,确保是新项目或已备份数据
    python manage.py makemigrations users_auth
    python manage.py migrate
    

4. 重新创建超级用户

现在执行命令即可正常创建:

python manage.py createsuperuser

此时命令会提示输入Email address而非Username,输入邮箱和密码即可完成创建。

常见坑点提醒

  • 不要在REQUIRED_FIELDS中添加email,因为USERNAME_FIELD已经默认是必填项
  • 自定义manager的create_superuser必须调用self.create_user,不要重复写逻辑
  • 修改用户模型后必须重新迁移,否则Django仍会使用旧的模型结构

内容的提问来源于stack exchange,提问作者Alberto Fernndez-Palacios Aqui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:20:40