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

Django自定义用户模型创建超级用户缺少必填参数报错求助

解决Django创建超级用户时的TypeError问题

我看了你的代码,发现几个关键问题导致了这个create_superuser() missing 3 required positional arguments错误,咱们一步步来修复:

1. 字段拼写错误

在你的UserManager的create_user、create_superuser和create_staffuser方法里,你把last_name误写成了las_name,这会导致无法正确给用户对象赋值,甚至引发额外的错误。

2. 模型@property属性错误

你的User模型里的几个属性装饰器(@property)引用了不存在的字段:

  • @property def is_staff(self): return self.staff → 应该返回self.is_staff(模型字段是is_staff,不是staff)
  • 同理is_admin和is_active也犯了同样的错误,这会导致调用这些属性时触发AttributeError。

3. create_superuser方法参数冗余

你把first_name、last_name、location设为必填参数,但这些字段在模型里是允许为空的(blank=True),而且不在REQUIRED_FIELDS里。当你运行python manage.py createsuperuser时,Django不会提示输入这些字段,自然就会缺少参数触发错误。我们需要把这些参数设为可选(默认值为None),让方法可以在不传入这些参数的情况下执行。


修正后的完整代码

models.py

from django.db import models
from django.contrib.auth.models import (
    AbstractBaseUser, BaseUserManager, PermissionsMixin
)

class UserManager(BaseUserManager):
    def create_user(self, mobile_no, role, email, first_name=None, last_name=None, location=None, password=None, is_active=True, is_staff=False, is_admin=False):
        if not mobile_no:
            raise ValueError("User must have a Mobile number as username ")
        if not password:
            raise ValueError("Users must have a password")
        
        user_obj = self.model(mobile_no=mobile_no)
        user_obj.email = email
        user_obj.set_password(password)
        user_obj.role = role
        # 仅当参数不为None时赋值(允许为空)
        if first_name:
            user_obj.first_name = first_name
        if last_name:
            user_obj.last_name = last_name
        if location:
            user_obj.location = location
        user_obj.is_active = is_active
        user_obj.is_staff = is_staff
        user_obj.is_admin = is_admin
        user_obj.save(using=self._db)
        return user_obj

    def create_superuser(self, mobile_no, role, email, first_name=None, last_name=None, location=None, password=None, is_active=True):
        # 超级用户强制设置is_staff和is_admin为True
        user_obj = self.create_user(
            mobile_no,
            role,
            email,
            first_name=first_name,
            last_name=last_name,
            location=location,
            password=password,
            is_active=is_active,
            is_staff=True,
            is_admin=True
        )
        user_obj.save(using=self._db)
        return user_obj

    def create_staffuser(self, mobile_no, role, email, first_name=None, last_name=None, location=None, password=None, is_active=True):
        user_obj = self.create_user(
            mobile_no,
            role,
            email,
            first_name=first_name,
            last_name=last_name,
            location=location,
            password=password,
            is_active=is_active,
            is_staff=True,
            is_admin=False
        )
        user_obj.save(using=self._db)
        return user_obj

class User(AbstractBaseUser, PermissionsMixin):
    mobile_no = models.CharField(max_length=10, unique=True)
    email = models.EmailField(max_length=255)
    role = models.CharField(max_length=255)
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    location = models.CharField(max_length=30, blank=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)

    USERNAME_FIELD = 'mobile_no'
    REQUIRED_FIELDS = ['email', 'role']

    objects = UserManager()

    def get_full_name(self):
        return f"{self.first_name} {self.last_name}".strip()
    
    def get_short_name(self):
        return self.mobile_no
    
    def __str__(self):
        return self.mobile_no

    # 修正@property引用错误
    @property
    def is_staff(self):
        return self.is_staff
    
    @property
    def is_admin(self):
        return self.is_admin
    
    @property
    def is_active(self):
        return self.is_active

验证方法

  1. 先执行数据库迁移:python manage.py makemigrations 和 python manage.py migrate
  2. 运行创建超级用户命令:python manage.py createsuperuser
  3. 此时只会提示你输入mobile_no、email、role和密码,不需要输入first_name等字段,就能成功创建超级用户。

这样既满足了“不为三个字段设置默认值”的要求,又能正常创建超级用户,同时修复了代码里的其他潜在错误。

内容的提问来源于stack exchange,提问作者VA splash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:45:57