与之前的生鲜电商项目相比较,本次的用户应用模型层会更深入复杂,涉及到创建超级用户、创建普通用户和用户权限。
一、指定自定义的用户模型
① Django 自定义的 User model 满足一些最低要求:
② AbstractBaseUser 的子类必须定义的关键的字段和方法:
必须设置。设置认证标识,设置成标识的字段 unique=True
# USERNAME_FIELD 这个属性是以后在使用authenticate 进行验证的字段
USERNAME_FIELD = 'telephone'
必须设置。当通过 createsuperuser 管理命令创建一个用户时,用于提示的一个字段名称列表。
# 这个属性是用来,以后在命令行中使用createsuperuser命令的时候,会让你输入的字段
# 只用创建超级管理员的时候,就会让你输入 USERNAME_FIELD 指定的字段
# 现在 USERNAME_FIELD 指定的字段是 telephone ,以及password 这个字段不写也会让你输入
REQUIRED_FIELDS = ['username']
必须定义。一个布尔属性,标识用户是否是“active” 激活。AbstractBaseUser 默认为 True。
# 是否激活
is_active = models.BooleanField(default=True)
必须定义。long 格式的用户标识。
def get_full_name(self):
return self.username
必须定义。short 格式的用户标识。
def get_short_name(self):
return self.username
③ AbstractBaseUser 的子类可以使用的方法:
返回 USERNAME_FIELD 的值
一直返回 False。用来区分 AnonymousUser
一直返回 True。用来告诉用户已被认证
设置密码。按照给定的原始字符串设置用户的密码。不保存 AbstractBaseUser 对象。如果没有给定密码,密码就会被设置成不使用,同用 set_unusable_password()。
检查密码是否正确。 给定的密码正确返回 True。
设置user无密码。 不同于密码为空,如果使用 check_password(),则不会返回True。不保存AbstractBaseUser 对象。
如果设置了set_unusable_password(),返回False。
返回密码字段的HMAC。
二、为 User 模型自定义管理器
继承自 BaseUserManager
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
from django.db import models
class UserManager(BaseUserManager):
def _create_user(self, telephone, username, password, **kwargs):
# self.model 等价于 User()
user = self.model(telephone=telephone, username=username, **kwargs)
# 密码需要加密,不能直接放在用户在保存
user.set_password(password)
user.save()
return user
def create_user(self,telephone,username,password,**kwargs):
kwargs['is_superuser'] = False
return self._create_user(telephone, username, password, **kwargs)
def create_superuser(self, telephone, username, password, **kwargs):
kwargs['is_superuser'] = True
return self._create_user(telephone, username, password, **kwargs)
三、自定义用户和权限
Django 提供了 PermissionsMixin。这是一个抽象的类,可以为自定义用户模型中的类的层次结构中包含它。它提供所有 Django 权限类必须的方法和字段。
class User(AbstractBaseUser,PermissionsMixin):
# 手机号 和 邮箱 是唯一
telephone = models.CharField(max_length=11, unique=True)
username = models.CharField(max_length=100)
# 指定邮箱可以为空 默认不为空 创建用户时只传入了 username password
email = models.EmailField(unique=True, null=True)
# 是否激活
is_active = models.BooleanField(default=True)
# 0 代表未知,1 男 ;2 女
gender = models.IntegerField(default=0)
date_joined = models.DateTimeField(auto_now_add=True)
is_staff = models.BooleanField(default=False)
# USERNAME_FIELD 这个属性是以后在使用authenticate 进行验证的字段
USERNAME_FIELD = 'telephone'
# 这个属性是用来,以后在命令行中使用createsuperuser命令的时候,会让你输入的字段
# 我们只用创建超级管理员的时候,就会让你输入 USERNAME_FIELD 指定的字段
# 现在 USERNAME_FIELD 指定的字段是 telephone ,以及password 这个字段不写也会让你输入
REQUIRED_FIELDS = ['username']
# 以后给某个用户发送邮箱的时候,就会使用这个属性指定的字段的值来发送
EMAIL_FIELD = 'email'
# User() 会传给 UserManager() 保存在 model() 中
objects = UserManager()
def get_full_name(self):
return self.username
def get_short_name(self):
return self.username
四、修改配置文件
覆盖默认的 User 模型。Django 允许通过修改 settings.py 文件中的 AUTH_USER_MODEL 设置覆盖默认的 User 模型,其值引用一个自定义的模型。
# AUTH_USER_MODEL 这个属性是 django 内置的,会主动到这个文件中查找这个属性,
# 如果找到了,那么就会使用这个属性指定的模型来作为 User 对象
# AUTH_USER_MODEL 这个属性是一个字符串,规则是 “appname.Modelname”
# app 下的哪个模型
# 如果设置了 AUTH_USER_MODEL,那么项目的 makemigrations 以及 migrate命令
# 必须要在设置完这些东西后再执行
AUTH_USER_MODEL = 'User'