Django自定义用户模型创建超级用户时缺失必填参数报错如何解决?
Django自定义用户模型创建超级用户报错解决方案
错误原因
报错由三处代码错误共同导致:
- 第一处:必填字段属性拼写错误
Django中指定createsuperuser命令需要额外输入的字段的属性为复数形式REQUIRED_FIELDS,你的代码里写成了单数REQUIRED_FIELD,系统无法识别到你配置的三个必填字段,因此执行命令时不会弹出对应输入提示,直接调用方法就会缺少入参。 - 第二处:create_superuser方法语法错误
你调用create_user的代码行末尾多写了一个逗号,会将返回的user对象自动包装为元组,后续给user赋值属性时会触发额外报错。 - 第三处:超级用户属性配置缺失
create_superuser方法需要额外给用户设置is_superuser = True和is_active = True,否则创建的账号没有超级管理员权限。同时如果要使用Django默认权限体系,用户模型需要额外继承PermissionsMixin。
修正后代码
修正后的MyAccountManager类
class MyAccountManager(BaseUserManager): def create_user(self, first_name, last_name, username, email, password=None): email = self.normalize_email(email) if not email: raise ValueError('User Must have a email') first_name = first_name.title() last_name = last_name.title() username = username.title() user = self.model( email=email, first_name=first_name, last_name=last_name, username=username ) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, first_name, last_name, username, password=None): # 移除末尾多余逗号,修正user被转为元组的问题 user = self.create_user( email=email, password=password, first_name=first_name, last_name=last_name, username=username ) user.is_staff = True # 补充超级用户必备属性 user.is_superuser = True user.is_active = True user.save(using=self._db) return user
修正后的Account模型
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin # 新增继承PermissionsMixin,支持Django默认权限体系 class Account(AbstractBaseUser, PermissionsMixin): first_name = models.CharField(max_length=50, blank=True, null=True) last_name = models.CharField(max_length=50, blank=True, null=True) username = models.CharField( max_length=50, default='test', unique=True, blank=True, null=True) email = models.EmailField(max_length=100, unique=True) phone_number = models.CharField(max_length=50) # required date_joined = models.DateTimeField(auto_now_add=True) last_login = models.DateTimeField(auto_now_add=True) is_staff = models.BooleanField(default=False) is_active = models.BooleanField(default=False) objects = MyAccountManager() USERNAME_FIELD = 'email' # 修正为复数形式REQUIRED_FIELDS REQUIRED_FIELDS = ['username', 'first_name','last_name']
内容的提问来源于stack exchange,提问作者Md Mostafijur Rahman
相关产品推荐
相关产品推荐

