【編號0007】Django2中的三種User拓展方式
時隔7天,我又來發布文章了,前面那段時間去哪了呢?當然是開發去了
一時開發一時爽,一直開發一直爽
所以本篇文章,是關於Django2版本的User欄位拓展,一篇實用型文件
Django自帶的User模型,僅有如下欄位:
username【來自AbstractUser】賬號
first_name 【來自AbstractUser】
last_name【來自AbstractUser】
email 【來自AbstractUser】郵箱
is_staff 【來自AbstractUser】是否能進入admin後臺
is_active 【來自AbstractBaseUser】是否可用
data_joined【來自AbstractUser】註冊時間
last_login【來自AbstractBaseUser】最後登入時間
password【來自AbstractBaseUser】密碼
is_superuser【來自PermissionsMixin】是否是超級管理員
groups【來自PermissionsMixin】使用者所在組
user_permissions【來自PermissionsMixin】使用者許可權
以上是全部的欄位資訊,當然每個都註明了來源
什麼是來源?
答:
User是Django自帶的使用者模型,它是直接繼承的AbstractUser類,自身沒有定義任何的欄位;
而且AbstractUser雖然自己定義了部分欄位,同時也繼承了
AbstractBaseUser, PermissionsMixin
這兩個類的,所以User的後半部分欄位,來自於這倆個類。
所以User的欄位,由這三個類提供。
那拓展的第一個思路來了,撇開Django自帶的User,直接從繼承AbstractUser,並定義自己需要的欄位,就可以了。
第一種方案:繼承AbstractUser
# 已註冊的app,app名是book,該檔案是models。py
from
django。contrib。auth。models
import
AbstractUser
class
User
(
AbstractUser
):
nickname
=
models
。
CharField
(
max_length
=
100
,
verbose_name
=
“暱稱”
,
null
=
True
,
default
=
None
,
blank
=
True
)
phone
=
models
。
CharField
(
max_length
=
16
,
verbose_name
=
“手機號”
)
address
=
models
。
CharField
(
max_length
=
80
,
null
=
True
,
default
=
None
,
verbose_name
=
“地址”
,
blank
=
True
)
這是繼承和重寫的方法,那寫完就可以了嗎?
當然不是,還得在配置檔案裡面,說明一下,也就是settings。py,如下:
AUTH_USER_MODEL
=
‘book。User’
AUTH_USER_MODEL
是固定的,後面的值,是
app名。Model類名
到這裡就註冊好了,這裡就是自行註冊
AUTH_USER_MODEL
替換掉Django內建的User
Tips:此方法,Django1和2通用
第二種方案:繼承AbstractBaseUser
在介紹User欄位組成的時候,有介紹到:
User繼承AbstractUser,且沒有定義任何的欄位;
AbstractUser繼承AbstractBaseUser, PermissionsMixin,且定義了自己的欄位,其中first_name和last_name就是AbstractUser定義的
那有沒有方法,直接替換掉AbstractUser這個類?說實話,first_name和last_name瞅著挺煩的,能去掉是最好了;
當然可以了,如下操作:
class
User
(
AbstractBaseUser
,
PermissionsMixin
):
username
=
models
。
CharField
(
max_length
=
100
,
verbose_name
=
“賬號”
,
null
=
True
,
default
=
None
,
blank
=
True
)
nickname
=
models
。
CharField
(
max_length
=
100
,
verbose_name
=
“暱稱”
,
null
=
True
,
default
=
None
,
blank
=
True
)
phone
=
models
。
CharField
(
max_length
=
16
,
verbose_name
=
“手機號”
)
address
=
models
。
CharField
(
max_length
=
80
,
null
=
True
,
default
=
None
,
verbose_name
=
“地址”
,
blank
=
True
)
當然,選擇繼承AbstractBaseUser,就要注意,採取這個方案,在User中來自AbstractUser的欄位,全部不存在,需要的你要自己寫
如果是不繼承AbstractUser,則自帶的欄位就變成了入下內容:
is_active 【來自AbstractBaseUser】是否可用
last_login【來自AbstractBaseUser】最後登入時間
password【來自AbstractBaseUser】密碼
is_superuser【來自PermissionsMixin】是否是超級管理員
groups【來自PermissionsMixin】使用者所在組
user_permissions【來自PermissionsMixin】使用者許可權
在這裡你還可以選擇不繼承
PermissionsMixin
,這樣又少了三個欄位。
這個方案同樣需要配置settings。py的程式碼,一樣,就這個:
AUTH_USER_MODEL
=
‘book。User’
第三種方案:拓展User
這種方法最簡單,相對而已,一點都不優雅。
直接介紹吧,反正我不喜歡它,如下:
class
Profile
(
models
。
Model
):
belong_to
=
models
。
OneToOne
(
to
=
User
,
related_name
=
“profile”
,
verbose_name
=
“屬於”
)
nickname
=
models
。
CharField
(
max_length
=
100
,
verbose_name
=
“暱稱”
,
null
=
True
,
default
=
None
,
blank
=
True
)
phone
=
models
。
CharField
(
max_length
=
16
,
verbose_name
=
“手機號”
)
address
=
models
。
CharField
(
max_length
=
80
,
null
=
True
,
default
=
None
,
verbose_name
=
“地址”
,
blank
=
True
)
直接定義一個簡單的類,然後指定一個“一對一”的欄位,繫結到User,這樣就得到了專屬User的一個個人資訊拓展模型
簡單暴力,不修改任何的原始碼,所以也不太推薦
總結:怎麼方便怎麼來
具體怎麼用,就看你在專案中的具體崗位,和你有多少時間去完成這個功能
最後:使用郵箱|手機號|賬戶【三選一】+密碼登入
現在的網站,每個賬號都有賬戶名、手機號、郵箱這三者內容,所以在登入時,任意一個,外加一個密碼就可以驗證身份,實現登入,那在Ddjango的View中,寫怎麼樣的邏輯程式碼方便呢?
千萬不要使用
if。。。elif。。。elif。。。else
做判斷,難看,且程式碼有點多。
推薦使用Django模型的查詢語法,一行查詢語句,獲得當前是否有賬戶,如下:
# username是前端傳過來的值,可以是郵箱、手機號、賬戶名
username
=
request
。
POST
。
get
(
‘username’
)
password
=
request
。
POST
。
get
(
‘password’
)
user
=
User
。
objects
。
filter
(
Q
(
username
=
username
)
|
Q
(
=
username
)
|
Q
(
mobile
=
username
)
)
。
first
()
# if判斷,user存在,且密碼檢測正確
if
user
and
user
。
check_password
(
password
):
login
(
request
,
user
)
# 登入賬戶
這個程式碼,就是賬戶查詢和密碼檢測的全部內容了,不長,且好懂
以上就是本篇文章的全部介紹內容了
!放在最後
如果文章中有什麼錯誤或者建議修改的地方,歡迎留言糾正和回覆
如果你喜歡本篇文章,不妨關注一下我們的公眾號,每週更新兩篇原創技術文件,都是乾貨
下一篇:手工皮具能賺到錢嗎?