Django自定义用户模型报错:TypeError: create_superuser()收到意外参数'username'
搞定Django自定义用户模型的create_superuser TypeError问题
嘿,我知道你在自定义Django用户模型时碰到这个错误挺头疼的,我来帮你拆解下问题并搞定它!
为啥会报错?
你看到的TypeError: create_superuser() got an unexpected keyword argument 'username',主要是两个问题导致的:
- 你还没写完
create_superuser方法呢!Django在调用这个方法时会自动传一些参数(比如username),但你现在的方法没写完,根本接不住这些参数。 - 看你
create_user里的代码,你把name赋值给了username字段,但大概率你的自定义UserProfile模型里根本没定义username,或者你的manager方法参数和模型字段不匹配,这就导致参数传递混乱了。
一步步修复
1. 补全并写对create_superuser方法
create_superuser得和create_user的基础参数对应上,还要记得设置超级用户必须的几个字段(is_staff、is_superuser这些是Django认超级用户的关键)。
把你的UserProfileManager改成这样:
class UserProfileManager(BaseUserManager): """Helps Django work with our custom user model.""" def create_user(self, email, name, password=None): """Creates a user profile object.""" if not email: raise ValueError('Users must have an email address.') email = self.normalize_email(email) # 重点:如果你的模型没username字段,别瞎赋值!改成和模型字段匹配的name=name user = self.model(email=email, name=name) user.user_id = -1 user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, name, password=None): """Creates and saves a new superuser with given details.""" # 先调用create_user生成基础用户 user = self.create_user(email, name, password) # 给超级用户加上权限标识 user.is_staff = True user.is_superuser = True user.save(using=self._db) return user
2. 确保自定义UserProfile模型和manager匹配
检查下你的UserProfile模型,字段得和manager里的赋值对应上。比如你想用email当登录标识,不用username,模型得这么写:
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin from django.db import models class UserProfile(AbstractBaseUser, PermissionsMixin): """Custom user model using email instead of username.""" email = models.EmailField(max_length=255, unique=True) name = models.CharField(max_length=255) user_id = models.IntegerField(default=-1) is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) # 指定用咱们自定义的manager objects = UserProfileManager() # 告诉Django用email当登录的唯一标识 USERNAME_FIELD = 'email' # 创建用户时必须填的额外字段(createsuperuser命令会提示输入) REQUIRED_FIELDS = ['name'] def __str__(self): return self.email
3. 最后别忘了做迁移
改完模型和manager后,必须运行这两条命令更新数据库:
python manage.py makemigrations python manage.py migrate
验证一下
现在再运行python manage.py createsuperuser,跟着提示输入邮箱、名字和密码,应该就能正常创建超级用户,不会再弹出那个烦人的username错误啦!
内容的提问来源于stack exchange,提问作者whoAmI
相关产品推荐
相关产品推荐

