• 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)
    
    
    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    python基础十一之装饰器进阶
    python基础十之装饰器
    python基础九之函数
    python基础八之文件操作
    python基础七之copy
    python基础七之集合
    python基础数据类型汇总
    python基础六之编码
    synchronized关键字的内存语义
    对于this和当前线程的一些理解
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12348146.html
Copyright © 2020-2023  润新知