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里的。