2010-10-03 26 views
6

¿Hay alguna manera de acceder al contexto actual pasado por la vista en el procesador de contexto personalizado para que pueda agregar la variable que falta si quiero en lugar de anular la variable existente?Procesadores de contexto Django: ¿es posible acceder al contexto actual en ContextProcessor?

Lo que estoy tratando de lograr:

construyo mi URL de esta manera/city_slug/y yo quiero comprobar si la variable de la ciudad ya existen en el contexto, de lo contrario, quiero añadir ciudad para mi contexto (puede estar usando la última ciudad usada almacenada en la variable de sesión; de lo contrario será una ciudad predeterminada e incluso puede establecer una variable de sesión para el próximo uso.)

Creo que este es un problema muy común, ¿cómo lo solucionan?

Respuesta

2

No puede acceder al contexto actual desde un procesador de contexto, y creo que un middleware no sería la solución adecuada para usted. Tal vez tendría sentido crear su propia función de representación de plantilla que utilice en sus vistas y siempre le pase el contexto y la solicitud actual y coloque la funcionalidad que desea y renderice la plantilla al final con las funciones de representación habituales django te brinda!

0

No estoy seguro de si un procesador de contexto de plantilla personalizada puede hacer esto. Desde el documentation:

Un procesador de contexto tiene una interfaz muy simple: es sólo una función de Python que toma un argumento, un objeto HttpRequest, y devuelve un diccionario que obtiene añade al contexto de la plantilla. Cada procesador de contexto debe devolver un diccionario.

(Énfasis en el mío).

Debería considerar escribir un middleware personalizado en su lugar. Si alguien sabe de una manera de hacer que un procesador de contexto haga esto, me gustaría saberlo.

0

No puede hacer esto con un procesador de contexto Django: solo tienen acceso al objeto de solicitud, no al contexto de plantilla existente al que se agrega su resultado.

Almacenar la ciudad en las sesiones suena bien, si eso es lo que quiere. Las plantillas serían responsables de cualquier incumplimiento posterior; si necesita algo sofisticado, le recomendamos que lo envuelva en un custom template tag reutilizable.

2

Puede lograrlo usando TemplateResponse y TemplateResponse middleware.

+1

Esto es bueno, pero solo parece funcionar si la vista se construye de cierta manera para que devuelva un 'TemplateResponse'. Desafortunadamente, 'shortcuts.render_to_response' devuelve un' HttpResponse' a pesar de que representa una plantilla, por lo que esta no es la solución más robusta (por ejemplo, si está escribiendo una biblioteca de Django). Entonces, los escritores de bibliotecas: quédense con las etiquetas de plantilla personalizadas. –

Cuestiones relacionadas