下面是models.py
BaseUserManager
是Django框架提供的一个基础用户管理器类,它可以帮助我们定义自己的用户管理器。使用自定义用户管理器可以让我们在创建用户时添加额外的字段,或者修改默认的创建用户逻辑。通常情况下,我们需要继承BaseUserManager
类并重写其中的方法来实现自定义的用户管理器。在上述代码中,CustomUserManager
类就是一个自定义的用户管理器,它继承了BaseUserManager
类并实现了create_user
和create_superuser
两个方法。
AbstractBaseUser
是 Django 提供的一个基类,用于自定义用户模型。它定义了一些必要的属性和方法,例如 USERNAME_FIELD
和 REQUIRED_FIELDS
,以及 set_password()
和 check_password()
等用于密码验证的方法。通过继承 AbstractBaseUser
,可以更灵活地定义自己的用户模型,例如增加一些额外的字段或修改认证方式等。
在上面的代码中,我们创造了两个用户类,分别是AbstractBaseUser
和CustomUser
。其中,AbstractBaseUser
是Django提供的一个抽象类,它提供了一些基本的用户属性和方法,比如is_authenticated
和set_password()
等,我们可以根据自己的需求在CustomUser
中继承和重载这些属性和方法。
CustomUser
是我们自定义的用户类,继承了AbstractBaseUser
,并添加了一些自己的属性和方法,比如login_attempts
和last_login_ip
等。我们之所以需要自定义用户类,是因为Django自带的User
模型可能无法满足我们的需求,比如我们可能需要为用户添加一些自定义属性,或者将用户模型与其他模型关联起来。
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
import datetime
class CustomUserManager(BaseUserManager):
# 创建用户
def create_user(self, username, password=None, **extra_fields):
if not username:
# 如果用户名为空,则抛出 ValueError 异常
raise ValueError('用户名必填')
# 创建用户
user = self.model(username=username, **extra_fields)
# 设置密码
user.set_password(password)
# 保存用户
user.save()
return user
# 创建超级用户
def create_superuser(self, username, password=None, **extra_fields):
# 设置为管理员和超级用户
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
# 创建用户
return self.create_user(username, password, **extra_fields)
class CustomUser(AbstractBaseUser):
# 用户名
username = models.CharField(max_length=30, unique=True)
# 注册时间
date_joined = models.DateTimeField(default=datetime.datetime.now)
# 是否激活
is_active = models.BooleanField(default=True)
# 是否为员工
is_staff = models.BooleanField(default=False)
# 是否为超级用户
is_superuser = models.BooleanField(default=False)
# 登录尝试次数
login_attempts = models.IntegerField(default=0)
# 最后一次尝试登录的时间
last_attempt_time = models.DateTimeField(null=True, blank=True)
# 最后一次登录的 IP 地址
last_login_ip = models.GenericIPAddressField(null=True, blank=True)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = []
objects = CustomUserManager()
def __str__(self):
return self.username