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
相关产品推荐
相关产品推荐

