162.擴展User模型-使用Proxy模型

擴展用戶模型:

Django內置的User模型雖然已經足夠強大了,可是有時候仍是不能知足咱們的需求,好比在驗證用戶登陸的時候,它用的是用戶名做爲驗證,而咱們有時候須要經過手機號碼或者是郵箱進行驗證,還有好比咱們想要增長一些字段,那麼這時候咱們就須要擴展用戶模型了,擴展用戶模型有多種方式。

1.設置Proxy模型(設置代理的形式):

若是你對Django中提供的字段,已經驗證方式都比較滿意,最主要的就是不須要添加任何的字段,只是須要在原有的基礎上增長一些操做的方法,那麼建議使用這種方式,這種方式操做起來很是簡單,而且能夠經過代理的形式來爲原有的模型定義一些方法、屬性等,可是不能再原有字段的基礎上定義其餘的字段。models.py文件示例代碼以下:
from django.db import models
from django.contrib.auth.models import User


class Person(User):
    class Meta:
    <!--設置proxy=True,標記該模型不用映射到數據庫中,只是一個代理-->
        proxy = True

    <!--定義一個類方法,cls就是當前的類對象,即user-->
    @classmethod
    def get_blacklist(cls):
        return cls.objects.filter(is_active=False)
在views.py文件中,應用User代理模型定義的方法get_blacklist()獲取全部的is_active爲False的用戶。
from .models import Person
from django.http import HttpResponse
from django.contrib.auth.models import User
from django.shortcuts import render


def index(request):
    users = Person.get_blacklist()
    if users:
        print(type(users))
        for user in users:
            print(user.username)
        context = {
            'users': users
        }
        return render(request, 'proxy.html',context=context)
    else:
        context = {
            'users': '沒有查找到誒!'
        }
        return render(request, 'proxy.html', context=context)
在proxy.html中接收視圖函數中的上下文。
<ul>
    {% for user in users %}
        <li>未激活的帳號:{{ user.username }}</li>
    {% endfor %}

</ul>

==在瀏覽器中,就會顯示當前數據庫中is_active爲False的用戶。==html

在以上示例中,咱們定義了一個Person類,繼承自User,而且在Meta中設置了proxy=True,說明這個只是User的一個代理模型。它並不會影響原來User模型在數據庫中的表的結構。之後若是你想方便的獲取全部黑名單的人(帳號不能使用的用戶),那麼就能夠經過Person.get_blacklist()就能夠獲取到,而且User.objects.all()和Person.objects.all()是相同的,由於他們都是從User這個模型中獲取全部的數據。
相關文章
相關標籤/搜索