Django自定义User模型创建超级用户遇TypeError错误求助
解决Django createsuperuser报错:TypeError: UserManager.create_superuser() missing 1 required positional argument: 'username'
问题根源是你继承的AbstractUser自带的UserManager仍依赖username字段,但你已将模型中的username设为None并以email作为登录标识,因此需要自定义用户管理器适配你的模型。
解决方案步骤:
- 在
User模型文件中添加自定义UserManager,重写create_user和create_superuser方法,移除对username的依赖:
from django.contrib.auth.models import AbstractUser, BaseUserManager from django.db import models class UserManager(BaseUserManager): def create_user(self, email, password=None, **extra_fields): if not email: raise ValueError('必须提供邮箱地址') email = self.normalize_email(email) user = self.model(email=email, **extra_fields) user.set_password(password) # Django内置密码加密方法 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('超级用户必须设置 is_staff=True') if extra_fields.get('is_superuser') is not True: raise ValueError('超级用户必须设置 is_superuser=True') return self.create_user(email, password, **extra_fields) class User(AbstractUser): name = models.CharField(max_length=32) email = models.CharField(max_length=140, unique=True) # 注意:删除自定义的password字段,AbstractUser已自带该字段并处理加密逻辑 username = None USERNAME_FIELD = 'email' REQUIRED_FIELDS = [] objects = UserManager() # 绑定自定义用户管理器
- 执行数据库迁移命令:
python manage.py makemigrations python manage.py migrate
- 再次运行创建超级用户命令:
python manage.py createsuperuser
此时会提示输入邮箱和密码,即可正常创建超级用户。
关键说明:
- 不要手动定义
password字段:AbstractUser已包含该字段,且通过set_password自动处理密码加密存储,手动定义会破坏加密机制。 - 自定义管理器是必要操作:默认
UserManager逻辑依赖username字段,重写后才能适配以email为唯一标识的用户模型。
内容的提问来源于stack exchange,提问作者Pirralho VFX
相关产品推荐
相关产品推荐

