如果你想修改django默认的验证方式,并且对于原来User
模型上的一些字段不想要,那么可以自定义一个模型,然后继承自AbstractBaseUser
,再添加你想要的字段。这种方式会比较麻烦,最好是确定自己对Django
比较了解才推荐使用。步骤如下:
- 创建模型。示例代码如下:
from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.db import models
class User(AbstractBaseUser,PermissionsMixin):
email = models.EmailField(unique=True)
username = models.CharField(max_length=150)
telephone = models.CharField(max_length=11,unique=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
USERNAME_FIELD = 'telephone'
REQUIRED_FIELDS = []
# 这里的UserManager同方法3, 需要重写
objects = UserManager()
def get_full_name(self):
return self.username
def get_short_name(self):
return self.username
其中password和last_login是在AbstractBaseUser中已经添加好了的,我们直接继承就可以了。然后我们再添加我们想要的字段。比如email、username、telephone等。这样就可以实现自己想要的字段了。但是因为我们重写了User,所以应该尽可能的模拟User模型:
1. USERNAME_FIELD:用来描述User模型名字字段的字符串,作为唯一的标识。如果没有修改,那么会使用USERNAME来作为字段。
2. REQUIRED_FIELDS:一个字段名列表,用于当通过createsuperuser管理命令创建一个用户时的提示。
3. is_active:一个布尔值,用于标识用户当前是否可用。
4. get_full_name():获取完整的名字。
5. get_short_name():一个比较简短的用户名。
2. 重新定义UserManager
:我们还需要定义自己的UserManager
,因为默认的UserManager
在创建用户的时候使用的是username
和password
,那么我们要替换成telephone
。示例代码如下:
# models.py
from django.contrib.auth.base_user import BaseUserManager
# 重写UserManager
class UserManager(BaseUserManager):
use_in_migrations = True
def _create_user(self, telephone, password, **extra_fields):
if not telephone:
raise ValueError("请填入手机号码!")
if not password:
raise ValueError("请填入密码!")
user = self.model(telephone=telephone, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, telephone, password, **extra_fields):
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
return self._create_user(telephone, password, **extra_fields)
def create_superuser(self, telephone, password, **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('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self._create_user(telephone, password, **extra_fields)
3. 在创建了新的User
模型后,还需要在settings
中配置好。配置AUTH_USER_MODEL='appname.User'
。
# settings.py
AUTH_USER_MODEL = 'youappname.User'
好了,完成以上几步就可以像原来使用User一样开始您的项目之旅了!
文档:https://docs.djangoproject.com/zh-hans/3.0/topics/auth/customizing/