我想爲django.contrib.auth.models.User
模型添加便利/模型方法。這樣做的最佳做法是什麼,上次檢查時,擴展用戶模型被認爲是不好的做法。將便捷方法添加到Django Auth用戶模型的最佳方法是什麼?
我有一個單獨的自定義UserProfile
模型。我是否應該爲所有用戶相關的便利方法使用它?
我想爲django.contrib.auth.models.User
模型添加便利/模型方法。這樣做的最佳做法是什麼,上次檢查時,擴展用戶模型被認爲是不好的做法。將便捷方法添加到Django Auth用戶模型的最佳方法是什麼?
我有一個單獨的自定義UserProfile
模型。我是否應該爲所有用戶相關的便利方法使用它?
這取決於你試圖添加到模型中。如果你想加入的用戶的詳細信息,那麼它通常建議您使用UserProfile
方法:http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users
不過,如果你只是想添加自定義方法或管理者的User
模型,我會說,這是更合乎邏輯的使用代理模式,就像這樣:
from django.contrib.auth.models import User
class UserMethods(User):
def custom_method(self):
pass
class Meta:
proxy=True
代理模式將在同一個數據庫表的原始模式運作,所以非常適合創建自定義的方法,而無需物理擴展模型。只需將您視圖中的User
的引用替換爲UserMethods
即可。 (當然,您也可以在管理工具通過註銷的User
模型,代替它註冊您的代理模型使用。)
任何實例被創建將通過UserMethods
模型即時訪問原User
模式,反之亦然。更多在這裏:http://docs.djangoproject.com/en/dev/topics/db/models/#proxy-models
(NB代理模式需要的Django 1.1及以上)
是的。當你的用戶模型附加了一個.get_profile()函數時,不需要混淆基礎。
+1,仍然不建議擴展用戶模型,並且所有配置文件的管道已經在使用中。 – 2009-11-30 14:48:44
顯然,'get_profile()'已棄用。 – Flimm 2015-12-28 16:42:58
您可以在配置文件模型上添加'OneToOne'字段並調用'user_instance.profile'而不是使用'get_profile()'。 – 2016-01-31 20:08:15
我更喜歡使用在各個項目中的相同用戶配置我開發和任何具體項目需要擴展用戶。所以,通用功能轉到UserProfile,而項目特定功能轉到自定義User。我還沒有任何具有分類的用戶模型的不利影響,我不知道Django 1.0+是否還存在。
2013更新:
在1.5,你可以sustitute一個自定義的用戶模型,並添加任何你想要的https://docs.djangoproject.com/en/dev/topics/auth/customizing/#auth-custom-user
如果你想添加自定義方法的用戶模型,我會建議monkey_patching:
創建一個文件monkey_patching.py
您的任何apps
::
#app/monkey_patching.py
from django.contrib.auth.models import User
def get_user_name(self):
if self.first_name or self.last_name:
return self.first_name + " " + self.last_name
return self.username
User.add_to_class("get_user_name",get_user_name)
並將其導入到應用程序的__init__.py
文件中。即:::
#app/__init__.py
import monkey_patching
良好的通話!完全忘記了代理模式。我正在運行1.1,但正在考慮1.0的心態。 – Soviut 2009-11-30 19:35:37
有沒有簡單的方法將request.user的類型更改爲代理類型?這是必要的,或者我可以直接調用request.user代理方法嗎? – slacy 2011-10-27 16:40:08
我與@slacy有同樣的疑問,並在此答案中找到了一種方法:https://stackoverflow.com/a/11526049/188614。基本上,您必須繼承django.contrib.auth.backends.ModelBackend,並在get_user上返回UserMethods,並將其設置爲AUTHENTICATION_BACKENDS。 – 2014-10-20 11:57:49