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。
相關文章
相關標籤/搜索