您當前的位置:首頁 > 收藏

【編號0007】Django2中的三種User拓展方式

作者:由 布啦豆 發表于 收藏時間:2019-08-07

時隔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

email

=

username

|

Q

mobile

=

username

first

()

# if判斷,user存在,且密碼檢測正確

if

user

and

user

check_password

password

):

login

request

user

# 登入賬戶

這個程式碼,就是賬戶查詢和密碼檢測的全部內容了,不長,且好懂

以上就是本篇文章的全部介紹內容了

!放在最後

如果文章中有什麼錯誤或者建議修改的地方,歡迎留言糾正和回覆

如果你喜歡本篇文章,不妨關注一下我們的公眾號,每週更新兩篇原創技術文件,都是乾貨

【編號0007】Django2中的三種User拓展方式

標簽: name  AbstractUser  user  true  Models