2009-02-23 7 views
11

Estoy trabajando en una aplicación de blog, y quiero tener una barra lateral que incluya una lista de todos los meses que el blog ha estado en existencia, para proporcionar enlaces a páginas de archivos. Además, me gustaría que esto se actualice automáticamente cuando cambie el mes, en lugar de codificarlo en la plantilla. Por supuesto, hasta donde puedo decir, esto significa que tendré que calcular la lista de meses en cada vista, y pasarla a cada plantilla de cada vista.¿Cómo puedo pasar una variable estática estándar de todas las vistas en Django?

Me gustaría evitar esto, si es posible. ¿Hay alguna manera de calcular la lista una vez y aplicarla automáticamente a cada plantilla, sin tener que pasarla explícitamente a la plantilla desde cada vista?

Respuesta

17

Hay algunas posibles soluciones a su problema.

Si realmente desea tener esto en cada página en su sitio a context processor es probablemente su mejor opción. Los procesadores de contexto son una forma básica de inyectar datos en todos los contextos de plantilla. Sin embargo, tenga en cuenta que se llamará al procesador de contexto en cada solicitud.

Una solución alternativa sería crear un custom template tag y utilizarlo en una plantilla base compartida para todas las páginas que desea tener en su barra lateral. Las etiquetas de plantilla son un poco más complejas de crear, pero son más flexibles.

Con cualquiera de las soluciones también debe mirar Django's cache framework. El marco de caché hace que sea bastante fácil almacenar temporalmente sus valores calculados por un tiempo para ahorrar algo de trabajo en cada solicitud.

+1

+1 por mencionar una etiqueta de plantilla personalizada. A menos que este sea un valor que usará literalmente en cada página del sitio, ese es un mejor enfoque que un procesador de contexto. –

0

La herencia de la plantilla de Django debe cubrir esto. Puede crear una plantilla base que maneje la funcionalidad de su barra lateral. Sus otros puntos de vista extienden esta plantilla.

herencia de plantillas: http://www.djangobook.com/en/1.0/chapter04/#s-template-inheritance

+0

Ya uso herencia de plantilla. ¿Cómo me evitará tener que pasar la variable de cada vista a la plantilla? – mipadi

+0

Lo siento, significaba agregar en la respuesta anterior que puede generar/modificar la plantilla base desde un script externo que se ejecuta el primer día del mes. – Harold

0

Una combinación de etiquetas de plantilla personalizados como se mencionó anteriormente y template fragment caching debe hacer el truco.

+0

+1 para el almacenamiento en caché de fragmentos. Por supuesto, todavía tiene que obtener los datos para el fragmento si es obsoleto. Arreglamos la búsqueda de variables en el código de la plantilla para permitir el paso de funciones. La función (curried para que sus parámetros no tengan que pasarse) solo se llama durante la regeneración de fragmentos. –

Cuestiones relacionadas