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这个模型中获取全部的数据。
相关文章
相关标签/搜索