164.扩展User模型-继承AbstractUser

继承自AbstractUser:

若是Abstractuser中定义的字段不可以知足你的项目的要求,而且不想要修改原来User对象上的一些字段,只是想要增长一些字段,那么这时候能够直接继承自django.contrib.auth.models.AbstractUser。其实,这个类也是django.contrib.auth.models.User 的父类。
(1)好比咱们想要在原来的User模型的基础上添加一个telephone和school字段,示例代码以下:
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    telephone = models.CharField(max_length=11, unique=True)
    school = models.CharField(max_length=100)
    
    <!--USERNAME_FIELD表明的是User模型的名字字段的字符串,具备惟一性。若是没有通过修改,默认就是username-->
    <!--如今,咱们将它修改成telephone,以后咱们对用户进行登陆验证的时候,就不用使用username了,而是使用telephone-->
    USERNAME_FIELD = 'telephone'

==最重要的是,若是咱们使用这种继承的方式修改了Django内置的User模型,那么咱们就须要第一次将User模型映射到数据库中的时候就要将User模型定义好。==html

若是在修改User模型的表的结构以前已经将Django内置的模型映射到数据库中了。那么,咱们就须要将数据库中全部的表删除,而且将项目中生成的脚本文件删除。以后从新执行python manage.py makemigrations; python manage.py migrate命令,就能够在数据库中的user表中看到咱们新添加的两个字段telephone和school了。
(2)由于咱们为User模型添加了两个字段,而且将USERNAME_FIELD='username'改成了USERNAME_FIELD='telephone',若是咱们想要调用User.objects.create_user()建立普通用户的话,而且让用户默认必须输入的只读为telephone,username,password,而没有以前的email,那么就能够重写objects上的create_user()方法,示例代码以下:
from django.contrib.auth.models import AbstractUser, BaseUserManager

<!--重写objects上的方法,之因此定义为UserManager类,是由于User.objects.返回的就是UserManager类-->
class UserManager(BaseUserManager):
    <!--建立超级用户和普通用户的差异就是超级用户的is_super=True而普通用户的is_super=False,因此咱们能够定义一个广泛的函数用来实现两者的相同的部分,不一样的部分就在各个函数中单独定义-->
    <!--定义一个两边有一个下划线的方法,就表明这个方法是受到保护的,只能在这个类中使用-->
    def _create_user_(self,telephone, username, password, **kwargs):
        <!--首先判断telephone是否存在-->
        if not telephone:
            raise ValueError('请输入手机号!')
        if not password:
            raise ValueError('请输入密码!')
        
        <!--self:表明的是当前的这个类,咱们要为当前的这个类的模型User建立一个实例化的对象-->
        user = self.model(telephone=telephone, username=username, password=password)
        <!--一样设置密码的话,也能够使用这样的形式-->
        <!--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)

        
<!--而且须要在从新定义User的模型中,添加objects = UserManager()-->
(3)以后若是想要咱们的User模型生效的话,就须要配置settings.py文件中的AUTH_USER_MODEL = 'appname.modelname',在咱们的项目中就是:AUTH_USER_MODEL = 'front.User'。
(4)接下来就能够在views.py文件中使用咱们从新定义的User模型添加用户了,示例代码以下:
from django.shortcuts import render
from .models import User


def index(request):
    user = User.objects.create_user(telephone="18833332222", username='孤烟逐云', password='111111')
    if user:
        print("建立成功!")
        print('%s' % user.username)
    else:
        print('fail!')
    return render(request,'abstractuser.html')
在咱们的数据库表front_user中就能够看到咱们建立的用户了。固然了,以上是建立普通用户。
(5)接下来,咱们就能够建立超级用户了,只须要将上面代码中的调用create_user()方法换成create_superuser()就能够了,
def index(request):
    user = User.objects.create_superuser(telephone="18833334444", username='小龙虾', password='111111')
    if user:
        print("建立成功!")
        print('%s' % user.username)
    else:
        print('fail!')
    return render(request,'abstractuser.html')
(6)接下来就能够使用Django内置的验证方法进行验证了,示例代码以下:
def index(request):
    # 登陆验证
    telephone = request.GET.get('telephone')
    password = request.GET.get('password')
    
    <!--须要注意的是,这里的username对应的值是telephone,由于咱们在models.py文件中指定了USERNAME_FIELD='telephone'-->
    user = authenticate(request, username=telephone,password=password)
    if user:
        print('您查找的用户是:%s' % user.username)
    context = {
        'user': user
    }
    return render(request, 'abstractuser.html', context=context)
在浏览器中输入url:http://127.0.0.1:8000/?telephone=********&password=**** ,就会查找出数据库中对应的user。
相关文章
相关标签/搜索