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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:11:26