django學習日志之自定義用戶擴展


django 為我們提供了強大的用戶認證系統,並且提供了基於該系統的User模型,所以,很多時候,我們有必要對自己的user進行業務擴展,得到滿足我們自己業務需求的user。借此,寫下自己的感悟。

user內置屬性如下:

username

用戶名,必需字段。30個字符或更少,包含 _, @, +, . 和 - 字符。

first_name
可選。 <=30字符.

last_name
可選。 <=30字符r.

email
郵箱,可選。 Email地址.

password
密碼,必需。Django不是以明文存儲密碼的,而是存儲哈希值。

以及兩個外鍵:

groups
用戶組。

user_permissions
用戶權限。

很明顯,這些很多時候是不夠用的。

但是,我學會了兩種擴展方法。

第一種,很明顯我們用一對一關系就可以擴展自己的屬性了吧,比如,我想要加個address地址屬性。

首先系統的User對象模型在django.contrib.auth.models里面,然后寫自己的模型,建立一對一關系,我的代碼如下

#app里面的models模塊
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class UserProfile(models.Model):
    user = models.OneToOneField(User)
    address = models.CharField(max_length=100)

好makemigrations和migrate(關於遷移可以參考官方文檔)進數據庫先。

admin應該知道吧,讓我看看到底長什么樣,於是,在控制台python manage.py createsuperuser創建個admin。

長這樣,當然不是我們希望的,這種擴展,不管用在什么時候,就算是自己對自己模型的擴展,也不是完美的,然而admin系統也提供了一些自定義的樣式,應該說提供了很多。其中我們可以讓兩個模型一起顯示吧。

#原來的admin.py文件
from django.contrib import admin
from blog.models import *
# Register your models here.

admin.site.register(UserProfile)

這是原來的admin,我修改成這樣

from django.contrib import admin
from blog.models import *
# Register your models here.
class ProfileInline(admin.StackedInline):
    model = UserProfile
    verbose_name = 'profile'

class UserAdmin(admin.ModelAdmin):
    inlines = (ProfileInline,)

admin.site.register(User,UserAdmin)

register第二個參數我們傳了UserAdmin,意思是用一個自定義的admin模型來修飾,具體細節官方文檔有很多,用inlines 修飾,這里寫一個inlne類進去,就像上面的ProfileInline一樣,我們想要插入的是模型填了我們擴展的UserProfile.然后定意思了一個verbose_name,這是它的名字,好了現在admin變成什么樣了,我來看一下。

對了,出錯了,他說User已經注冊了。所以我在admin.site.register上面加了一句admin.site.unregister(User),因為默認系統是注冊了User對象。

好再看看,成功!

先上一頁系統自己的row吧

 

然后看看是否有擴展:

可以看到我們自己的擴展地址:address欄,至此,也就擴展成功了。

第二張方法,django模型系統,自帶繼承,我們可以用繼承來實現。

 在models.py里面,我們寫入如下模型,繼承系統的AbstractUser

這種方法和系統User的耦合度非常好

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.

class User(AbstractUser):
    address = models.CharField(max_length=100)

當然,系統默認還是自帶的user,需要在setting文件里面把系統默認user替換寫入如下語句

 

blog是我的app名字,根據自己app設置

然后在admin里面注冊自己的User就行了。

看看效果如何:

 

address出現了,同時我們會發現這個User是在系統原來的User里的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM