本教程為系列教程,為方便閱讀,每篇教程開頭列出全部教程的目錄索引: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 模組的基本用法,例如如何提供使用者...