users type permission multi fields auth django django-models

django - type - ¿Cómo convertir request.user en un proxy auth.User class?



multi user django (2)

Es otro hit de la base de datos, pero esto funcionará:

OrderedUser.objects.get(pk=request.user.pk)

Editar Puedes probar:

o = OrderedUser() o.__dict__ = request.user.__dict__

Tengo el mismo enigma que se presenta en esta pregunta , pero se aplicó a auth.User de Django.

Tengo este modelo de proxy:

class OrderedUser(User): def __unicode__(self): return self.get_full_name() class Meta: proxy=True ordering=["first_name", "last_name"]

Y algunos de mis otros modelos utilizan un OrderedUser lugar de un django.contrib.auth.models.User como tipos de campo.

En mis vistas, luego uso el request.user para rellenar un campo y, como se espera, obtener un error:

''Cannot assign "<User...>": <field> must be a "OrderedUser" instance''

Podría hacer OrderedUser.objects.get(request.user.id) , pero eso es un golpe adicional a la base de datos.

Entonces, ¿cómo convertir una clase de modelo base en su clase de proxy?


No pude conseguir que el método de dictado de copia funcionara en Python 2.7.4 y Django 1.6. No lo rastreé del todo, pero creo que tuvo algo que ver con que fuera un objeto perezoso.

Lo que funcionó para mí:

request.user.__class__ = OrderedUser

Evita la llamada a la base de datos y da acceso a las cosas de autenticación base y todos mis comportamientos extendidos.

Para hacer que el request.user actúe como la clase proxy siempre, coloco la asignación en middleware después del middleware de autenticación y antes de que cualquiera de mis aplicaciones pueda hacer referencia a él. Como se llama al middleware en cada solicitud, asegúrese de que el usuario esté autenticado antes de configurar la clase. Usando su ejemplo, aquí está el aspecto del código de middleware:

from yourapp.models import OrderedUser class OrderedUserMiddleware(): def process_request(self, request): if hasattr(request, ''user'') and request.user.is_authenticated(): request.user.__class__ = OrderedUser

Y recuerde registrar el middleware después de la autenticación:

MIDDLEWARE_CLASSES = [ # ...middleware from the guts of Django, none of your middle wares yet... ''django.contrib.auth.middleware.AuthenticationMiddleware'', # ...more middleware from the guts of Django, none of your middlewares yet... ''yourapp.middleware.OrderedUserMiddleware'', # ...more middleware from you other middlewares... ]