這做項目時發現django自帶的User中的字段不夠用,默認的auth_user表總共只有11個字段,如果需要更多的字段該怎么辦,在網上搜了一下,有這么幾種方法。
1. 直接修改django 源碼,修改User class 的定義,以及各種方法等,然后把數據庫auth_user表里的字段擴展到與自己需求一致。(源代碼在:django.contrib.auth.models import User),這種方式,每次升級django都得很小心。這種不適用於我們這種新手。
2.把django 的user以及認證部分的源代碼拷貝到自己的app下面,然后修改,配置,這樣就不需要改動django的代碼了.但如果你要升級django ,就可能有麻煩。這種也不適用於我們。
3.繼承User,做擴展。這種方法有兩種方式,一是繼承AbstractUser,另一種是繼承AbstractBaseUser。自己試了下繼承AbstractUser,在syncdb時不再建立auth_user表,而是建立了以你的模塊名為表名的表,你只需要在你的Model里增加你需要的字段即可,比如:
1 class CustomUser(AbstractUser): 2 company = models.CharField(max_length=30,default='無', 3 verbose_name="公司名")
這樣會在數據庫中建立xxx_customuser表,其中的字段包含了company,還包含了原來的auth_user中的所有字段。然后在setting.py中添加一句AUTH_USER_MODEL = app名.CustomUser'。而且你仍然可以以request.user的方式獲得字段的值。
如果你選擇繼承AbstractBaseUser,那么除了password、last_login和is_active這三個字段外,你需要自己實現你需要的其它字段,根據需要可以使用django的驗證方式,也可以自己編寫驗證后端,這種方式如果處理不好不知道會不會影響運行,目前還沒有深入研究。
4.profile 方式擴展。如果只是添加幾個無關緊要的字段的話,這種自己感覺靈活又簡便,但是,如果用戶很多,訪問量較大的話,會對系統性能帶來影響。如果你是想用email作為驗證方式的話,還是得通過繼承User來實現,這也是django1.6推薦的方式。
5.不修改django源碼也不增加profile表的擴展用戶模型。這個大家可以去搜搜。之前看到這個帖子,感覺很激動,確實是好方法啊,但自己怎么也實現不了,原因是里面的第一句和第三句開發環境提示我無效的變量add_to_class和append,不知道是什么原因,索性沒去管它,syncdb后數據庫中的字段沒有增加,自己無能無法實現,也不知道原因。而且還有一個問題,就算能夠成功,在admin頁面里能不能顯示添加的字段呢?希望有人能夠幫我解決這個問題,不勝感激!
1 User.add_to_class(obj_name, obj) 2 UserAdmin.fieldsets = list(UserAdmin.fieldsets) 3 UserAdmin.fieldsets.append((name, {'fields': fields}))
6.使用contribute_to_class這個函數。自己試了一下,比如:
1 company_field = models.CharField(max_length=30) 2 company_field.contribute_to_class(User, 'company')
確實可以直接就在auth_user表中添加這個字段,但是這個字段無法在admin頁面顯示出來,我想應該還是有辦法的,比如修改源代碼或者顯示的模板,不過最好是不用修改源代碼,還是希望有人能夠告訴我實現方法,謝謝了。
以上就是本人這兩天的一點點收獲,最后對user的擴展還是通過使用profile來實現的。