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

Django自定义AbstractUser创建超级用户时报错:缺少username参数

问题描述

基于Django的AbstractUser自定义了CustomMyUserModel,将phone_number设为USERNAME_FIELD并移除了username字段,同时自定义了UserManager。执行python manage.py createsuperuser创建超级用户时触发TypeError,提示UserManager.create_superuser()缺少必填的username参数。

模型代码

class CustomMyUserModel(AbstractUser):
    username = None
    phone_number = models.CharField(max_length=100, unique=True)
    email = models.EmailField(unique=False)
    user_bio = models.CharField(max_length=50)
    user_profile_image = models.ImageField(upload_to='upload')

    USERNAME_FIELD = 'phone_number'
    REQUIRED_FIELDS = []
    objects = UserManager()

UserManager代码

from django.contrib.auth.base_user import BaseUserManager


class UserManager(BaseUserManager):
    def create_user(self, phone_number, password=None, **extra_fields):
        if not phone_number:
            raise ValueError('The Phone Number Is required:')

        extra_fields.setdefault('email', self.normalize_email(extra_fields.get('email')))
        user = self.model(phone_number=phone_number, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, phone_number, 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(phone_number, password=password, **extra_fields)

执行命令

(overrideuser) hamza@hamza-HP-EliteBook-840-G1:~/PycharmProjects/pythonProject2/OverrideUser$ python manage.py createsuperuser

错误信息

Phone number: 030476701645 Email: hamzabiall@gmail.com Password: Password (again):
Traceback (most recent call last):
  File "/home/hamza/PycharmProjects/pythonProject2/OverrideUser/manage.py", line 22, in <module>
    main()
  File "/home/hamza/PycharmProjects/pythonProject2/OverrideUser/manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/home/hamza/PycharmProjects/pythonProject2/overrideuser/lib/python3.10/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line
    utility.execute()
  File "/home/hamza/PycharmProjects/pythonProject2/overrideuser/lib/python3.10/site-packages/django/core/management/__init__.py", line 436, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/hamza/PycharmProjects/pythonProject2/overrideuser/lib/python3.10/site-packages/django/core/management/base.py", line 412, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/hamza/PycharmProjects/pythonProject2/overrideuser/lib/python3.10/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 88, in execute
    return super().execute(*args, **options)
  File "/home/hamza/PycharmProjects/pythonProject2/overrideuser/lib/python3.10/site-packages/django/core/management/base.py", line 458, in execute
    output = self.handle(*args, **options)
  File "/home/hamza/PycharmProjects/pythonProject2/overrideuser/lib/python3.10/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 233, in handle
    self.UserModel._default_manager.db_manager(database).create_superuser(
TypeError: UserManager.create_superuser() missing 1 required positional argument: 'username'
解决方案

错误根源在于Django的createsuperuser命令会沿用BaseUserManager的参数签名逻辑,尝试传递username参数,但自定义的UserManager方法签名使用了phone_number作为第一个位置参数,导致参数不匹配。

方法一:兼容参数签名,映射username到phone_number

修改UserManager的方法签名,将第一个参数改为username,内部将其映射为phone_number:

from django.contrib.auth.base_user import BaseUserManager


class UserManager(BaseUserManager):
    def create_user(self, username, password=None, **extra_fields):
        # 由于USERNAME_FIELD设为phone_number,此处username实际是传入的手机号
        phone_number = username
        if not phone_number:
            raise ValueError('The Phone Number Is required:')

        extra_fields.setdefault('email', self.normalize_email(extra_fields.get('email')))
        user = self.model(phone_number=phone_number, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, password=None, **extra_fields):
        phone_number = username
        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(phone_number, password=password, **extra_fields)

方法二:改用关键字参数接收所有字段(更推荐)

修改UserManager的方法,通过**extra_fields接收所有参数,直接从字典中提取phone_number,避免参数名冲突:

from django.contrib.auth.base_user import BaseUserManager


class UserManager(BaseUserManager):
    def create_user(self, password=None, **extra_fields):
        phone_number = extra_fields.get('phone_number')
        if not phone_number:
            raise ValueError('The Phone Number Is required:')

        extra_fields.setdefault('email', self.normalize_email(extra_fields.get('email')))
        user = self.model(**extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, 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(password=password, **extra_fields)

额外检查

确保在项目的settings.py中配置了自定义用户模型:

AUTH_USER_MODEL = '你的应用名.CustomMyUserModel'

修改完成后,重新执行python manage.py createsuperuser即可正常创建超级用户。

内容的提问来源于stack exchange,提问作者Hamza Bilal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:07:04