Utilizando variables en todos los templates de Django
Cuando programamos plantillas de django algo de lo que nos percatamos rápidamente es que gran parte del código de nuestra web se repite en todas las páginas. Por ejemplo un menú dinámico que se genera a partir de una serie de categorías necesitará una consulta a la bases de datos cada vez que se muestra una página.
Normalmente para enviar datos a la plantilla lo hacemos enviando diccionarios con los datos desde las vistas, además contamos con la context_instance para jugar con sesiones y otras variables:
def index(request):
secciones = Secciones.objects.all()
return render_to_response('plantilla.html', {'secciones': secciones },
context_instance=RequestContext(request))
Sin embargo, si tenemos docenas de plantillas es incómodo tener que enviar siempre los diccionarios para pintar un menú. Para ello existen los procesador de contexto aka Context Processors.
¿Recordáis que hace poco os hablé de los Middlewares? Éstos actuaban sobre las peticiones y respuestas de django. Pues los procesadores de contexto nos permiten jugar con, según su propia definición, la instancia de contexto.
Por ejemplo, si creamos un procesador de contexto que añada un diccionario a nuestro contexto, éste se añadirá a todas nuestras plantillas. Lo haremos de la siguiente forma:
Creamos el fichero con el procesador de contexto en el directorio de nuestro proyecto principalconfiguracion_general.py con el siguiente código:
def datos_globales(request):
secciones = Secciones.objects.all()
dict = {
'SITE_URL': 'http://ejemplo.com',
'SITE_NAME': 'Mi Sitio de Ejemplo',
'SITE_AUTHOR': 'Hector Costa',
'SECCIONES': secciones
}
return dict
A continuación cargamos el módulo en la lista de procesadores de contexto en settings.py. Esta lista no existe en las versiones recientes de Django y si se crea hay que cargar todos los procesadores de contexto por defecto manualmente a parte del nuestro:
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.core.context_processors.tz",
"django.contrib.messages.context_processors.messages",
"django.contrib.auth.context_processors.auth",
'miproyecto.configuracion_general.datos_globales',
)
Así podremos utilizar nuestro diccionario cómodamente en cualquier parte de nuestro proyecto sin cargar nada en las vistas:
Bienvenidos a <a href="{{SITE_URL}}">{{SITE_NAME}}</a>, creado por {{SITE_AUTHOR}}
<ul>
{% for seccion in SECCIONES %}
<li><a href="{{SITE_URL}}/{{seccion.slug}}">{{seccion.nombre}}</a></li>
{% enfor %}
Por último si en alguna vista deseamos añadir una variable global a nuestro diccionario de contexto sin tener que pasar un nuevo diccionario, podemos modificarlo de la siguiente forma:
from django.shortcuts import render_to_response
from django.template import RequestContext
def index(request):
diccionario_global = RequestContext(request)
# Creamos la nueva clave y el nuevo valor para esta vista
diccionario_global['SITE_YEAR'] = '2012'
return render_to_response('plantilla.html', diccionario_global)
fuente:http://www.hcosta.info/wp/2012/10/utilizando-variables-en-todos-los-templates-de-django/
Normalmente para enviar datos a la plantilla lo hacemos enviando diccionarios con los datos desde las vistas, además contamos con la context_instance para jugar con sesiones y otras variables:
def index(request):
secciones = Secciones.objects.all()
return render_to_response('plantilla.html', {'secciones': secciones },
context_instance=RequestContext(request))
Sin embargo, si tenemos docenas de plantillas es incómodo tener que enviar siempre los diccionarios para pintar un menú. Para ello existen los procesador de contexto aka Context Processors.
¿Recordáis que hace poco os hablé de los Middlewares? Éstos actuaban sobre las peticiones y respuestas de django. Pues los procesadores de contexto nos permiten jugar con, según su propia definición, la instancia de contexto.
Por ejemplo, si creamos un procesador de contexto que añada un diccionario a nuestro contexto, éste se añadirá a todas nuestras plantillas. Lo haremos de la siguiente forma:
Creamos el fichero con el procesador de contexto en el directorio de nuestro proyecto principalconfiguracion_general.py con el siguiente código:
def datos_globales(request):
secciones = Secciones.objects.all()
dict = {
'SITE_URL': 'http://ejemplo.com',
'SITE_NAME': 'Mi Sitio de Ejemplo',
'SITE_AUTHOR': 'Hector Costa',
'SECCIONES': secciones
}
return dict
A continuación cargamos el módulo en la lista de procesadores de contexto en settings.py. Esta lista no existe en las versiones recientes de Django y si se crea hay que cargar todos los procesadores de contexto por defecto manualmente a parte del nuestro:
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.core.context_processors.tz",
"django.contrib.messages.context_processors.messages",
"django.contrib.auth.context_processors.auth",
'miproyecto.configuracion_general.datos_globales',
)
Así podremos utilizar nuestro diccionario cómodamente en cualquier parte de nuestro proyecto sin cargar nada en las vistas:
Bienvenidos a <a href="{{SITE_URL}}">{{SITE_NAME}}</a>, creado por {{SITE_AUTHOR}}
<ul>
{% for seccion in SECCIONES %}
<li><a href="{{SITE_URL}}/{{seccion.slug}}">{{seccion.nombre}}</a></li>
{% enfor %}
Por último si en alguna vista deseamos añadir una variable global a nuestro diccionario de contexto sin tener que pasar un nuevo diccionario, podemos modificarlo de la siguiente forma:
from django.shortcuts import render_to_response
from django.template import RequestContext
def index(request):
diccionario_global = RequestContext(request)
# Creamos la nueva clave y el nuevo valor para esta vista
diccionario_global['SITE_YEAR'] = '2012'
return render_to_response('plantilla.html', diccionario_global)
fuente:http://www.hcosta.info/wp/2012/10/utilizando-variables-en-todos-los-templates-de-django/
0 Response to "Utilizando variables en todos los templates de Django"
Publicar un comentario