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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:05:20