如何在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
相关产品推荐
相关产品推荐

