He llegado a un punto en el que necesito pasar ciertas variables a todas mis vistas (principalmente variables de tipo de autenticación personalizadas).
Me dijeron que escribir mi propio procesador de contexto era la mejor manera de hacer esto, pero estoy teniendo algunos problemas.
Mi archivo de configuración se ve así
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.contrib.messages.context_processors.messages",
"sandbox.context_processors.say_hello",
)
Como puede ver, tengo un módulo llamado 'context_processors' y una función dentro de ese llamado 'say_hello'.
Que parece
def say_hello(request):
return {
'say_hello':"Hello",
}
¿Tengo razón al asumir que ahora puedo hacer lo siguiente dentro de mis puntos de vista?
{{ say_hello }}
En este momento, esto se traduce en nada en mi plantilla.
Mi vista parece
from django.shortcuts import render_to_response
def test(request):
return render_to_response("test.html")
fuente
RequestContext
). Piense en el procesador de contexto que hizo. Tomarequest
como argumento. Eso significa que de alguna manera necesita dar la solicitud actual a la lógica de renderizado.RequestContext
básicamente, solo maneja la lógica simple de recorrer todos los procesadores de contexto y pasarles la solicitud actual, luego actualizar el contexto de la página con los resultados.return render_to_response('template.html', context_instance=RequestContext(request))
es viejo fasion, creo quereturn render(request,'template.html')
es más secoDe acuerdo con los documentos de django , puede usarlo
render
como un atajo en lugar de render_to_response con el argumento context_instance:fuente
Desde Django 1.8, registra sus procesadores de contexto personalizados de esta manera:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [ 'templates' ], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'www.context_processors.instance', ], }, }, ]
asumiendo que su procesador de contexto está en la aplicación
www
encontext_processors.py
fuente
Si está utilizando el
render_to_response()
acceso directo de Django para completar una plantilla con el contenido de un diccionario, a su plantilla se le pasará una instancia de contexto por defecto (no aRequestContext
). Para usar unRequestContext
en la representación de su plantilla, use elrender()
atajo que es el mismo que una llamada arender_to_response()
con uncontext_instance
argumento que fuerza el uso de unRequestContext
.fuente