165.扩展User模型-继承AbstractBaseUser

继承自AbstractBaseUser模型

若是你想要修改默认的验证方式,而且对于User模型上的一些字段不想要,那么能够自定义一个模型,而后继承自AbstractBaseUser,再添加你想要的字段,这种方式会比较麻烦,最好是肯定本身对Django比较了解才推荐使用。
(1)建立模型, 示例代码以下:
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
from django.contrib.auth.models import AbstractUser


class UserManager(BaseUserManager):
    def _create_user_(self, telephone, username, password, **kwargs):
        if not telephone:
            raise ValueError('请输入密码!')
        if not username:
            raise ValueError('请输入用户名!')

        # 注意,这里是self.model表明的是当前的User模型而不能写self.User()由于UserManager没有这个属性
        user = self.model(telephone=telephone, username=username)
        user.set_password(password)
        user.save()
        return user

    def create_user(self, telephone, username, password, **kwargs):
        kwargs['is_super'] = False
        return self._create_user_(telephone=telephone, username=username, password=password, **kwargs)

    def create_superuser(self, telephone, username, password, **kwargs):
        kwargs['is_super'] = True
        return self._create_user_(telephone=telephone, username=username, password=password, **kwargs)


# PermissionsMixin: 是定义用户时定义用户权限,必须继承
# AbstractBaseUser:User的基类其中涉及的字段最少,若是先定义本身的User模型,
# 将大部分Django中默认的字段删除的话,就能够继承该类
# AbstractBaseUser类中定义的字段有:password,last_login,is_active,is_super
class User(AbstractBaseUser, PermissionsMixin):
    # 必须设置的两个字段username,email
    username = models.CharField(max_length=100)
    email = models.EmailField(unique=True)
    telephone = models.CharField(max_length=11, unique=True)

    is_active = models.BooleanField(default=True)

    # 惟一性验证设置为telephone
    USERNAME_FIELD = 'telephone'
    # REQUIRED_FIELDS为空的列表表明的是,在验证用户登陆的时候只须要输入password和USERNAME_FIELD指定的字段就好了
    # 若是还想在验证用户的时候输入其余的字段,那么就能够将该字段设置在该列表中。
    REQUIRED_FIELDS = []

    # 以上自定义的User模型上并无objects方法,因此咱们须要自定义
    objects = UserManager()

    def get_full_name(self):
        return self.username

    def get_short_name(self):
        return self.username
其中password、last_login、is_active都是定义好的字段类型,就不用修改了,
(2)在settings.py中配置AUTH_USER_MODEL='front.User'
(3)在views.py中使用自定义的User模型建立user。示例代码以下:
<!--1. 建立普通用户-->
from django.http import HttpResponse
from .models import User


def index(request):
    user = User.objects.create_user(telephone='18833332222', username='小龙虾', password='111111')
    user.email = '111111@qq.com'
    user.save()
    return HttpResponse('success!')
    
<!--2. 建立超级用户-->
def index(request):
    user = User.objects.create_superuser(telephone="18833337777", username='云中云', password='888888')
    user.email = '111111@qq.com'
    user.save()
    return HttpResponse('success!')
(4)此时,一样可使用外键与自定义的User模型相关联,示例代码以下:
from django.contrib.auth import get_user_model

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.CharField(max_length=100)
    <!--在使用外键的时候,可使用get_user_model()函数动态的获取关联的模型,这个模型是从settings.py文件中的AUTH_USER_MODEL中读取的。-->
    author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
相关文章
相关标签/搜索