2011-10-27 13 views
8

chciałbym zdefiniować model proxy dla Django domyślnej klasy użytkownika, coś niby tak:Przesyłanie z podstawowej instancji modelu do pochodnego modelu proxy w Django?

class MyUser(User): 

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

    class Meta: 
     proxy = True 

I chciałbym móc zadzwonić pretty_username z widoku kodu (a najlepiej, nawet z szablonów). Czy istnieje prosty sposób wzięcia instancji standardowego Modelu użytkownika i wpisania go w instancję MyUser?

Nawet niektóre __init__ magia byłaby w porządku ze mną, tak długo, jak mogę powiedzieć:

my_user = MyUser(request.user) 

w moim kodu widoku.

+1

Brzmi jak próbujesz zrobić opakowanie lub adaptera dla klasy Użytkownik. Czy coś takiego: http://ginstrom.com/scribbles/2009/03/27/the-adapter-pattern-in-python/ załatwić sprawę? – mbrenig

Odpowiedz

4

Jeśli naprawdę chcesz mieć pełny obiekt proxy dostępne, jest to szybki i brudny roztwór (kosztem dodatkowego połączenia bazy danych)

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) 

więc korzystać z tego w widoku można powiedzieć :

request.user.get_myuser().pretty_username() 

Albo w szablonie:

{{ request.user.get_myuser.pretty_username }} 

ładniejszym rozwiązaniem, jeśli nie jesteś przywiązany do model proxy pomysł, byłoby następujące:

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

User.add_to_class('pretty_username', pretty_username) 

Pozwoliłoby następujące:

request.user.pretty_username() 

Albo

{{ request.user.pretty_username }} 
+10

Metoda get_myuser musi zmienić typ obiektu użytkownika z User na MyUser. Można to zrobić za pomocą atrybutu '__class__': def get_myuser (self): self .__ class__ = MyUser' bez dodatkowej wywołania bazy danych – fhahn

Powiązane problemy