2011-10-27 81 views
8

我想定義Django默認的用戶類的代理模式,什麼樣的是這樣的:從基礎模型實例到Django派生代理模型?

class MyUser(User): 

    def pretty_username(self): 
     if self.first_name: 
      return self.first_name 
     return self.username 

    class Meta: 
     proxy = True 

而且,我希望能夠從視圖代碼調用pretty_username(理想情況下,甚至來自模板)。有沒有一種簡單的方法來獲取標準用戶模型的實例並將其輸入到MyUser的實例中?

即使是一些__init__魔術會跟我沒關係,只要我可以說:

my_user = MyUser(request.user) 
在我看來代碼

+1

這聽起來像你試圖做一個包裝或適配器爲用戶類。會是這樣的:http://ginstrom.com/scribbles/2009/03/27/the-adapter-pattern-in-python/ 做的伎倆? – mbrenig

回答

4

如果你真的想擁有全部可用的代理對象,這是一個快速和骯髒的解決方案(需額外數據庫調用的開銷)

class MyUser(User): 

    def pretty_username(self): 
     if self.first_name: 
      return self.first_name 
     return self.username 

    class Meta: 
     proxy = True 


def get_myuser(self): 
    try: 
     return MyUser.objects.get(pk=self.pk) 
    except MyUser.DoesNotExist: 
     return None 

User.add_to_class('get_myuser', get_myuser) 

所以使用這個視圖中,你可以說:

request.user.get_myuser().pretty_username() 

或模板:

{{ request.user.get_myuser.pretty_username }} 

一個更好的解決辦法,如果你不綁代理模型的想法,將是以​​下幾點:

def pretty_username(self): 
    if self.first_name: 
     return self.first_name 
    return self.username 

User.add_to_class('pretty_username', pretty_username) 

這將允許:

request.user.pretty_username() 

或者

{{ request.user.pretty_username }} 
+10

get_myuser方法必須將用戶對象的類型從用戶更改爲MyUser。這可以使用'__class__'屬性完成:'def get_myuser(self):self .__ class__ = MyUser' without without a additional database call – fhahn