2011-10-27 20 views
8

me gustaría definir un modelo de poder para la clase de usuario por defecto de Django, algo algo así como esto:Casting from base Modelo de instancia para proxy derivado Modelo en Django?

class MyUser(User): 

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

    class Meta: 
     proxy = True 

Y, me gustaría ser capaz de llamar a pretty_username del código de la vista (e idealmente, incluso de plantillas). ¿Existe una manera simple de tomar una instancia de un Modelo de Usuario estándar y convertirlo en una instancia de Mi Usuario?

Incluso algunos __init__ magia estaría bien conmigo, siempre que puedo decir:

my_user = MyUser(request.user) 

en mi código de la vista.

+1

Parece que usted está tratando de hacer una envoltura o el adaptador para la clase de Usuario. Algo como esto: http://ginstrom.com/scribbles/2009/03/27/the-adapter-pattern-in-python/ ¿Hacer el truco? – mbrenig

Respuesta

4

Si realmente quiere tener el objeto proxy completo, esta es una solución rápida y sucia (a expensas de una llamada de base de datos adicional)

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) 

Así que para usar esto en una vista que se podría decir :

request.user.get_myuser().pretty_username() 

O en una plantilla:

{{ request.user.get_myuser.pretty_username }} 

una solución más agradable, si usted no está ligado a la idea de modelo de poder, sería el siguiente:

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

User.add_to_class('pretty_username', pretty_username) 

Esto permitiría la siguiente:

request.user.pretty_username() 

O

{{ request.user.pretty_username }} 
+10

El método get_myuser tiene que cambiar el tipo de objeto de usuario de Usuario a MiUsuario. Esto se puede hacer usando el atributo '__class__':' def get_myuser (self): self .__ class__ = MyUser' sin una llamada adicional a la base de datos – fhahn

Cuestiones relacionadas