2011-10-27 22 views
8

Django'nun varsayılan Kullanıcı sınıfı için bir proxy Modeli tanımlamak istiyorum, bunun gibi bir şey:Temel Model örneğinden Django'da türetilmiş proxy Modeline dönüştürme?

class MyUser(User): 

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

    class Meta: 
     proxy = True 

Ve, pretty_username kodunu görünüm kodundan çağırmak istiyorum (ve ideal olarak, hatta şablonları). Standart Kullanıcı Modeli örneğini alıp MyUser örneğine yazmak için basit bir yol var mı?

Hatta bazı __init__ sihirleri, benim görüşüme göre

my_user = MyUser(request.user) 

diyebilirim.

+1

Kullanıcı sınıfı için. Bunun gibi bir şey: http://ginstrom.com/scribbles/2009/03/27/the-adapter-pattern-in-python/ hile yapmak? – mbrenig

cevap

4

gerçekten tam vekil nesne kullanılabilir olmasını istiyorsanız, bu hızlı ve kirli (ekstra bir veritabanı çağrı pahasına) çözümü

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) 

Yani diyebiliriz bir görünümde bu kullanmaktır :
request.user.get_myuser().pretty_username() 

Veya bir şablona

:

{{ request.user.get_myuser.pretty_username }} 

bir güzel bir çözüm, ister bağlı değilseniz Proxy modeli fikri, şu olacaktır:

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

User.add_to_class('pretty_username', pretty_username) 

Bu olanak sağlayacak aşağıdaki: Bir sarmalayıcı veya adaptörü yapmaya çalışıyoruz gibi geliyor

request.user.pretty_username() 

Ya

{{ request.user.pretty_username }} 
+10

get_myuser yönteminin, User nesnesinden MyUser'e kullanıcı nesnesinin türünü değiştirmesi gerekir. Bu, __class__' özniteliği kullanılarak yapılabilir: def get_myuser (self): ek bir veritabanı çağrısı olmadan self .__ class__ = MyUser' – fhahn

İlgili konular