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

Django实现手机号登录改造后创建超级用户报TypeError错误的解决方法咨询

解决Django自定义用户模型创建超级用户时的TypeError问题

这个错误的核心原因是你没有正确配置自定义用户模型的登录标识字段,默认的用户管理器还在依赖原生的username字段来创建超级用户。下面是一步步的解决方法:

1. 自定义用户管理器,适配手机号登录

默认的BaseUserManager是为原生username字段设计的,我们需要重写它的方法来支持用phone作为登录字段。在你的models.py中添加以下代码:

from django.contrib.auth.models import AbstractUser, BaseUserManager

# 自定义用户管理器
class UserpersonManager(BaseUserManager):
    def create_user(self, phone, password=None, **extra_fields):
        if not phone:
            raise ValueError('手机号必须填写!')
        # 初始化用户实例,用phone作为唯一标识
        user = self.model(phone=phone, **extra_fields)
        user.set_password(password)  # 加密存储密码
        user.save(using=self._db)
        return user

    def create_superuser(self, phone, password=None, **extra_fields):
        # 超级用户必须开启staff和superuser权限
        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(phone, password, **extra_fields)

2. 完善自定义用户模型的核心配置

修改你的Userperson类,指定登录字段、必填字段,并关联自定义管理器:

class Userperson(AbstractUser):
    gender_choice = [ ('M', 'male'), ('F', "female") ]
    roles = [ ('seller', 'Seller'), ('shopper', 'Shopper'), ('serviceman', 'Serviceman') ]
    fullname = models.CharField(max_length=100, verbose_name="Fullname")
    phone = models.CharField(max_length=20,verbose_name="Phone",unique=True)
    image = models.ImageField(upload_to="userphoto/fullname", blank=True, null=True, verbose_name="userPhoto")
    phone_auth = models.BooleanField(default=False)
    gender = models.CharField(choices=gender_choice, blank=False, null=False, max_length=50)
    role = models.CharField(choices=roles, max_length=50)
    
    # 告诉Django用phone作为用户的唯一登录标识
    USERNAME_FIELD = 'phone'
    # 创建用户(含超级用户)时必须填写的字段(除了phone和password)
    REQUIRED_FIELDS = ['fullname', 'gender', 'role']

    # 关联自定义的用户管理器
    objects = UserpersonManager()

    def __str__(self):
        return self.fullname  # 在admin后台中显示用户的全名

3. 配置全局默认用户模型

在项目的settings.py中添加以下配置,告诉Django使用你的自定义用户模型:

AUTH_USER_MODEL = '你的应用名.Userperson'

把你的应用名替换成实际存放Userperson模型的app名称,比如如果模型在users app下,就写'users.Userperson'。

4. 重置并执行数据库迁移

如果是开发环境,先删除项目根目录的db.sqlite3文件,以及应用下migrations文件夹中除了__init__.py之外的所有迁移文件,然后执行:

python manage.py makemigrations
python manage.py migrate

5. 创建超级用户

现在执行创建超级用户的命令:

python manage.py createsuperuser

系统会提示你依次输入手机号、全名、性别、角色,最后设置密码,就能成功创建超级用户了。

额外说明

  • 你的Admin配置不需要修改,Django admin会自动适配新的登录字段(phone),登录后台时直接输入手机号和密码即可。
  • 如果是生产环境,不要直接重置数据库,建议先备份数据,再逐步调整迁移脚本(自定义用户模型最好在项目初期就确定,避免后期修改带来的麻烦)。

内容的提问来源于stack exchange,提问作者benitekser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 14:57:36