天天看點

Django 繼承AbstractUser擴充使用者模型

Django 繼承AbstractUser擴充使用者模型

by:授客 QQ:1033553122

測試環境

Win 10

Python 3.5.4

Django-2.0.13.tar.gz

官方下載下傳位址:

https://www.djangoproject.com/download/2.0.13/tarball/

mysql-5.7.23-winx64.zip

概述

Django 使用者認證系統提供了一個内置的 User Model,用于記錄使用者的使用者名,密碼,郵箱,姓,名等個人資訊,這些資訊可能無法滿足實際需求,這種情況下,需要拓展使用者模型,如果項目還沒有使用 Django 内置 User 模型,可以采用繼承 AbstractUser 的拓展方式進行拓展(如果已經使用了Django的内置模型,Django會為其生成相關資料庫遷移檔案和資料庫表,采用繼承方式拓展會比較麻煩。)

檢視User模型源碼,(本文中檔案路徑為:

%PYTHON_HOME%\Lib\site-packages\Django-2.0.13-py3.5.egg\django\contrib\auth\models.py),如下,可知User僅是繼承了 AbstractUser,沒有對 AbstractUser 做任何的拓展,是以,如果我們可以自己繼承 AbstractUser,并根據自己的需求進行拓展。

Django 繼承AbstractUser擴充使用者模型
拓展使用者模型

建立自定義使用者模型

編輯應用的models.py(本文中應用為mysite,models.py路徑為projectName/mysite/models.py),添加以下帶背景色内容部分

from django.db import models

# Create your models here.

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):

    name = models.CharField(max_length=50, verbose_name='姓名')

    creater = models.CharField(max_length=20, verbose_name='建立人')

    create_time = models.DateTimeField(auto_now_add=True, verbose_name='建立時間')

    updater = models.CharField(max_length=20, verbose_name='更新人')

    update_time = models.DateTimeField(auto_now=True, verbose_name='更新時間')

    is_delete = models.BooleanField(default=False, verbose_name='是否删除')

修改項目settings.py

為了讓 Django 使用者認證系統使用我們自定義的使用者模型,必須在項目settings.py 裡通過 AUTH_USER_MODEL 指定自定義使用者模型,如下帶背景色部分的内容

...略

TEMPLATE_DIRS = (

    os.path.join(BASE_DIR,  'templates'),

)

AUTH_USER_MODEL = 'mysite.User'

注意變量值的格式:appName.CustomeUserModel,意為使用appName應用下的自定義CustomeUserModel使用者模型,本例為使用mysite應用的User模型

執行資料庫遷移

進入到項目根目錄,執行以下指令

python manage.py makemigrations mysite

python manage.py migrate

成功後,Django便會使用我們自定義的使用者模型作為預設的使用者模型了

注意:一定要在配置好 AUTH_USER_MODEL 變量後再遷移資料庫