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

如何在Django认证中用手机号替代用户名?自定义用户模型实现

嘿,我来帮你完善这个用手机号替代用户名的Django自定义用户模型实现,这是完整的代码和关键说明:

自定义用户模型(手机号替代用户名)

要实现用手机号替代默认用户名的用户模型,核心是重写AbstractUser和自定义BaseUserManager,以下是完整的models.py代码:

from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.core.validators import RegexValidator
from django.db import models
from django.utils.translation import ugettext_lazy as _


class UserManager(BaseUserManager):
    """为无用户名字段的User模型定义模型管理器。"""

    def create_user(self, phone_number, password=None, **extra_fields):
        """创建并保存一个使用手机号作为唯一标识的普通用户"""
        if not phone_number:
            raise ValueError(_('必须提供手机号'))
        # 可根据需求预处理手机号(比如去除空格、区号)
        user = self.model(phone_number=phone_number, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, phone_number, password=None, **extra_fields):
        """创建并保存一个使用手机号作为唯一标识的超级用户"""
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', 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_number, password, **extra_fields)


class User(AbstractUser):
    # 移除Django默认的username字段
    username = None
    # 定义手机号作为唯一登录标识
    phone_number = models.CharField(
        _('手机号'),
        max_length=11,
        unique=True,
        validators=[
            RegexValidator(
                regex=r'^1[3-9]\d{9}$',
                message=_('请输入有效的11位中国大陆手机号'),
                code='invalid_phone_number'
            )
        ],
        help_text=_('请输入11位中国大陆手机号')
    )

    # 指定手机号为系统认证的唯一标识字段
    USERNAME_FIELD = 'phone_number'
    # 超级用户创建时的额外必填字段(这里留空,手机号已作为核心标识)
    REQUIRED_FIELDS = []

    # 绑定自定义的用户管理器
    objects = UserManager()

    class Meta:
        verbose_name = _('用户')
        verbose_name_plural = _('用户')

    def __str__(self):
        return self.phone_number

关键细节说明

  • 移除默认用户名:通过username = None告诉Django不要生成默认的username字段,完全用手机号替代
  • 手机号格式验证:用RegexValidator确保输入的是符合中国大陆规范的11位手机号,避免无效数据
  • 认证核心配置:USERNAME_FIELD = 'phone_number'让Django的认证系统用手机号来验证用户登录
  • 自定义管理器:必须重写create_user和create_superuser方法,因为默认方法依赖username字段,咱们替换成了手机号逻辑
  • 必填字段设置:REQUIRED_FIELDS设为空,因为USERNAME_FIELD指定的手机号已经是创建用户时的必填项

后续必做配置

别忘了在项目的settings.py中指定自定义用户模型,否则Django还是会用默认模型:

AUTH_USER_MODEL = '你的应用名.User'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:32:37