2009-11-30 55 views

回答

29

這取決於你試圖添加到模型中。如果你想加入的用戶的詳細信息,那麼它通常建議您使用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及以上)

+0

良好的通話!完全忘記了代理模式。我正在運行1.1,但正在考慮1.0的心態。 – Soviut 2009-11-30 19:35:37

+14

有沒有簡單的方法將request.user的類型更改爲代理類型?這是必要的,或者我可以直接調用request.user代理方法嗎? – slacy 2011-10-27 16:40:08

+2

我與@slacy有同樣的疑問,並在此答案中找到了一種方法:https://stackoverflow.com/a/11526049/188614。基本上,您必須繼承django.contrib.auth.backends.ModelBackend,並在get_user上返回UserMethods,並將其設置爲AUTHENTICATION_BACKENDS。 – 2014-10-20 11:57:49

4

是的。當你的用戶模型附加了一個.get_profile()函數時,不需要混淆基礎。

+1

+1,仍然不建議擴展用戶模型,並且所有配置文件的管道已經在使用中。 – 2009-11-30 14:48:44

+0

顯然,'get_profile()'已棄用。 – Flimm 2015-12-28 16:42:58

+0

您可以在配置文件模型上添加'OneToOne'字段並調用'user_instance.profile'而不是使用'get_profile()'。 – 2016-01-31 20:08:15

-1

我更喜歡使用在各個項目中的相同用戶配置我開發和任何具體項目需要擴展用戶。所以,通用功能轉到UserProfile,而項目特定功能轉到自定義User。我還沒有任何具有分類的用戶模型的不利影響,我不知道Django 1.0+是否還存在。

14

如果你想添加自定義方法的用戶模型,我會建議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 
相關問題