Django 使用者認證系統 拓展 User 模型

2021-09-11 14:20:08 字數 4008 閱讀 2309

本教程為系列教程,為方便閱讀,每篇教程開頭列出全部教程的目錄索引:

django 使用者認證系統提供了乙個內建的 user 物件,用於記錄使用者的使用者名稱,密碼等個人資訊。對於 django 內建的user模型, 僅包含以下一些主要的屬性:

對於一些**來說,使用者可能還包含有暱稱、頭像、個性簽名等等其它屬性,因此僅僅使用 django 內建的 user 模型是不夠。好在 django 使用者系統遵循可拓展的設計原則,我們可以方便地拓展 user 模型。

這是推薦做法。事實上,檢視user模型的原始碼就知道,user 也是繼承自abstractuser抽象基類,而且僅僅就是繼承了abstractuser,沒有對abstractuser做任何的拓展。以下就是user的原始碼:

class

user

(abstractuser):

""" users within the django authentication system are represented by this

model.

username, password and email are required. other fields are optional.

"""class

meta

(abstractuser.meta):

複製**

所以,如果我們繼承abstractuser,將獲得user的全部特性,而且還可以根據自己的需求進行拓展。

users/models.py

from django.db import models

from django.contrib.auth.models import abstractuser

class

user

(abstractuser):

nickname = models.charfield(max_length=50, blank=true)

class

meta

(abstractuser.meta):

pass

複製**

我們給自定義的使用者模型新增了乙個 nickname(暱稱)屬性,用來記錄使用者的暱稱資訊,設定blank=true的目的是讓使用者在註冊時無需填寫暱稱。根據你的需求可以自己進一步拓展,例如增加使用者頭像、個性簽名等等,新增多少屬性字段沒有任何限制。

同時,我們繼承了abstractuser的內部類屬性meta,不過目前什麼也沒做。在這裡繼承meta的原因是在你的專案中可能需要設定一些meta類的屬性值,不要忘記繼承abstractuser.meta中已有的屬性。

注意:一定要繼承abstractuser,而不是繼承auth.user。儘管auth.user繼承自abstractuser且並沒有對其進行任何額外拓展,但abstractuser是乙個抽象類,而auth.user不是。如果你繼承了auth.user類,這會變成多表繼承,在目前的情況下這種繼承方式是不被推薦的。關於 django 的抽象模型類和多表繼承,請查閱 django 的官方文件 模型繼承。

此外,abstractuser類又繼承自abstractbaseuser,前者在後者的基礎上拓展了一套使用者許可權(permission)系統。因此如非特殊需要,盡量不要從abstractbaseuser拓展,否則你需要做更多的額外工作。

為了讓 django 使用者認證系統使用我們自定義的使用者模型,必須在 settings.py 裡通過auth_user_model指定自定義使用者模型所在的位置,即需要如下設定:

django_auth_example/settings.py

# 其它設定...

auth_user_model = 'users.user'

複製**

即告訴 django,使用 users 應用下的user使用者模型。

順便再修改一下語言設定和時區設定:

django_auth_example/settings.py

# 其它設定...

language_code = 'zh-hans'

time_zone = 'asia/shanghai'

複製**

設定好自定義使用者模型後,生成資料庫遷移檔案,並且遷移資料庫以生成各個應用必要的資料庫表。即執行如下兩條命令:

$ python manage.py makemigrations

$ python manage.py migrate複製**

ok,現在 django 使用者系統使用的使用者模型就是自定義的user模型了。

注意:一定要在設定好auth_user_model = 'users.user'後在第一次遷移資料庫,即指定好自定義的使用者模型後再執行資料庫遷移命令。

如果想為乙個已使用了 django 內建user模型的專案拓展使用者模型,上述繼承abstractuser的拓展方式會變得有點麻煩。django 沒有提供一套自動化的方式將內建的user遷移到自定義的使用者模型,因為 django 已經為內建的user模型生成了相關資料庫遷移檔案和資料庫表。如果非要這麼做的話,需要手工修改遷移檔案和資料庫表,並且移動資料庫中相關的使用者資料。

所以我們採用另一種不改動資料庫表的方式來拓展使用者模型,具體來說,我們在建立乙個模型(通常命名為 profile)來記錄使用者相關的資料,然後使用一對一的方式將這個 profile 模型和 user 關聯起來,就好像每個使用者都關聯著一張記錄個人資料的表一樣。**如下:

models.py

from django.contrib.auth.models import user

class

profile

(models.model):

nickname = models.charfield(max_length=50, blank=true)

user = models.onetoonefield(user)複製**

這種方式和abstractuser的區別是,繼承abstractuser的使用者模型只有一張資料庫表。而 profile 這種模式有兩張表,一張是 user 模型對應的表,一張是 profile 模型對應的表,兩張表通過一對一的關係關聯。可見,當要查詢某個使用者的 profile 時,需要執行額外的跨表查詢操作,所以這種方式比起直接繼承abstractuser效率更低一點。因此對於新專案來說,優先推薦使用繼承abstractuser的方式來拓展使用者模型。

ps:如果你使用了profile 模式,你可能希望在建立 user 物件的時候同時也建立與之關聯的 profile 物件。你可以使用 django 的 signal 實現這個需求。由於 profile 模式不是我們要介紹的重點內容,因此具體的實現細節請參照相關的文件,這裡不再贅述。

ok,自定義的 user 模型已經建立好了,接下來就是如何建立使用者,即使用者註冊流程了。

本教程的示例專案**位於 github:django auth example。

如果遇到問題,請通過下面的方式尋求幫助。

在 pythonzhcn 的 django 版塊 發布問題詳細描述的帖子。

django使用者認證系統 拓展 User 模型

django 使用者認證系統提供了乙個內建的 user 物件,用於記錄使用者的使用者名稱,密碼等個人資訊。對於 django 內建的user模型,僅包含以下一些主要的屬性 對於一些 來說,使用者可能還包含有暱稱 頭像 個性簽名等等其它屬性,因此僅僅使用 django 內建的 user 模型是不夠。好...

Django 使用者認證系統

二 auth模組 django內建乙個使用者認證系統,使用auth模組實現。auth模組提供了登入 註冊 效驗 修改密碼 登出 驗證使用者是否登入等功能。auth user 使用者表 auth user groups 使用者所屬組的表 auth user user permissions 使用者許可...

Django 使用者認證系統 基本設定

本教程為系列教程,為方便閱讀,每篇教程開頭列出全部教程的目錄索引 提供登入 註冊等使用者認證功能是乙個常見的需求。因此,django 提供了一套功能完整的 靈活的 易於拓展的使用者認證系統 django.contrib.auth。在本教程中,我將向你展示 auth 模組的基本用法,例如如何提供使用者...