2012-03-27 16 views
23

¿Hay alguna manera de obtener request.session desde dentro de una vista basada en clases?Obtener request.session desde una vista genérica basada en clase

Por ejemplo, he

from django.views.generic.edit import FormView 

class CreateProfileView(FormView): 
    def form_valid(self, form): 
     # --> would like to save form contents to session here 

     return redirect(self.get_success_url()) 

Lo único que se me ocurre sería anular as_view añadiendo

def as_view(self, request, *args, **kwargs): 
    self.session = request.session 
    super(CreateProfileView, self).as_view(request, *args, **kwargs) 

a la clase. Pero eso parece feo. ¿Hay otra manera?

Respuesta

44

Usted tiene acceso a self.request desde cualquier lugar dentro de la clase (y por lo tanto self.request.session)

https://docs.djangoproject.com/en/dev/topics/class-based-views/generic-display/#dynamic-filtering

La parte clave para hacer este trabajo es que cuando las opiniones basadas en la clase son llamados, varias cosas útiles se almacenan en uno mismo; además de la solicitud (auto.request) esto incluye los argumentos posicionales (self.args) y basados ​​en el nombre (self.kwargs) capturados según el URLconf.

+6

La parte importante aquí es "cuando las vistas basadas en clases * se llaman *"; es decir, debe hacerse dentro de uno de los * métodos * de la clase (por ejemplo, def get_context_data (self, ** kwargs)), no dentro de la clase, sino fuera de cualquier método. – Chirael

Cuestiones relacionadas