Django自定义users应用创建超级用户遇AttributeError问题求助
解决Django自定义用户模型创建超级用户的问题
核心原因
你的自定义用户模型对应的UserManager未继承Django官方的BaseUserManager,也未实现create_superuser方法;同时可能未在项目配置中指定自定义用户模型为默认用户模型,导致createsuperuser命令无法识别自定义字段与超级用户创建逻辑。
具体修复步骤
1. 修正用户管理器与用户模型代码
修改users/models.py,确保管理器继承BaseUserManager并实现必填方法,同时配置自定义字段的必填规则:
from django.db import models from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin class UserManager(BaseUserManager): def create_user(self, username, email, phone_number, password=None, **extra_fields): # 校验必填字段 if not username: raise ValueError("必须设置用户名") if not email: raise ValueError("必须设置邮箱") if not phone_number: raise ValueError("必须设置手机号") # 格式化邮箱并创建用户实例 user = self.model( username=username, email=self.normalize_email(email), phone_number=phone_number, **extra_fields ) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, username, email, phone_number, password=None, **extra_fields): # 超级用户权限配置 extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) extra_fields.setdefault('is_active', True) # 权限校验 if extra_fields.get('is_staff') is not True: raise ValueError("超级用户必须设置is_staff=True") if extra_fields.get('is_superuser') is not True: raise ValueError("超级用户必须设置is_superuser=True") return self.create_user(username, email, phone_number, password, **extra_fields) class User(AbstractBaseUser, PermissionsMixin): # 自定义用户字段 username = models.CharField(max_length=50, unique=True) email = models.EmailField(max_length=100, unique=True) phone_number = models.CharField(max_length=11, unique=True) # 权限相关字段 is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) # 绑定自定义管理器 objects = UserManager() # 指定登录用的用户名字段 USERNAME_FIELD = 'username' # 指定创建超级用户时需额外输入的字段 REQUIRED_FIELDS = ['email', 'phone_number']
2. 配置项目默认用户模型
在项目根目录的settings.py中添加以下配置,告诉Django使用你的自定义用户模型:
AUTH_USER_MODEL = 'users.User'
3. 重新执行数据库迁移
如果是项目初期未执行过迁移,直接运行以下命令;若已有迁移记录,需清空旧迁移文件(生产环境请先备份数据)后再执行:
python manage.py makemigrations python manage.py migrate
4. 重新创建超级用户
现在执行createsuperuser命令,就会按预期提示输入username、email、phone number和password:
python manage.py createsuperuser
关键说明
REQUIRED_FIELDS列表定义了创建超级用户时,除USERNAME_FIELD和密码外必须输入的字段,添加email和phone_number即可实现你需要的提示效果。- 必须确保
UserManager继承BaseUserManager并实现create_superuser方法,否则Django无法识别超级用户的创建逻辑,会抛出AttributeError。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

