2011-10-27 13 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

ですね:

def pretty_username(self): if self.first_name: return self.first_name return self.username User.add_to_class('pretty_username', pretty_username) 

これは、次のことが可能になりますUserクラスの場合次のようなものがありますか?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 }} 

よりよい解決策、あなたがに結び付けられていない場合プロキシモデルのアイデアは、次のようになります。あなたがラッパーまたはアダプタを作成しようとしているよう

request.user.pretty_username() 

それとも

{{ request.user.pretty_username }} 
+10

get_myuserメソッドは、ユーザーオブジェクトのタイプをUserからMyUserに変更する必要があります。これは '__class__'属性を使って行うことができます:追加のデータベース呼び出しをせずに' def get_myuser(self):self .__ class__ = MyUser' – fhahn

関連する問題