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
验证方法
- 先执行数据库迁移:
python manage.py makemigrations和python manage.py migrate - 运行创建超级用户命令:
python manage.py createsuperuser - 此时只会提示你输入
mobile_no、email、role和密码,不需要输入first_name等字段,就能成功创建超级用户。
这样既满足了“不为三个字段设置默认值”的要求,又能正常创建超级用户,同时修复了代码里的其他潜在错误。
内容的提问来源于stack exchange,提问作者VA splash
相关产品推荐
相关产品推荐

