执行python manage.py createsuperuser创建超级用户时报错:缺少username参数
问题分析与解决
错误原因
REQUIRED_FIELDS定义位置错误:它属于类级配置,需放在MyUserManager类的顶层,而非create_superuser方法内部,否则Django无法识别该配置。create_superuser参数逻辑错误:你试图将extra_fields['phone']赋值给self.username,不符合方法参数传递逻辑;且Django的createsuperuser命令不会自动传入username参数,导致参数缺失报错。create_user默认值占位符错误:参数中的...是语法占位符,需替换为实际默认值(如None)。
修复方案
步骤1:调整必填字段配置位置
将REQUIRED_FIELDS移至类顶层,指定创建用户时需输入的字段(你的场景为phone)。
步骤2:修正管理器方法逻辑
- 在
create_superuser中直接从extra_fields提取phone作为username,无需在方法参数中强制要求username。 - 补全超级用户的必要属性默认值,确保父类方法调用参数正确。
修正后的代码
from django.contrib.auth.base_user import BaseUserManager from typing import Any, Optional class MyUserManager(BaseUserManager): # 类级必填字段配置,指定创建用户时需输入的字段 REQUIRED_FIELDS = ['phone'] def create_superuser(self, email: Optional[str], password: Optional[str], **extra_fields: Any) -> Any: # 从extra_fields中获取phone作为username username = extra_fields.get('phone') if not username: raise ValueError("必须填写手机号") # 设置超级用户的核心属性默认值 extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) extra_fields.setdefault('is_active', True) return super().create_superuser(username, email, password, **extra_fields) def create_user(self, email: Optional[str] = None, password: Optional[str] = None, **extra_fields: Any) -> Any: username = extra_fields.get('phone') if not username: raise ValueError("必须填写手机号") return super().create_user(username, email, password, **extra_fields)
验证修复
执行命令:
python manage.py createsuperuser
此时命令会提示输入手机号、邮箱和密码,即可成功创建超级用户。
内容的提问来源于stack exchange,提问作者Alin
相关产品推荐
相关产品推荐

