2011-07-11 12 views
5

He corrido al siguiente problema de procesador de contexto de plantilla de Django.¿Por qué este procesador de contexto de plantilla Django no se aplica a todas las solicitudes?

El procesador contexto se define en myapp/context_processors.py:

def my_context_processor(request): 
    return { 
     'foo': 123, 
    } 

Se cablea en settings.py junto con los procesadores estándar de contexto Django:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth', 
    'django.core.context_processors.debug', 
    'django.core.context_processors.i18n', 
    'django.core.context_processors.media', 
    'myproject.myapp.context_processors.my_context_processor', 
) 

El problema que estoy encontrando es que my_context_processor no se aplica a todas las solicitudes.

Se no se aplica para el siguiente código:

def index(request): 
    return render_to_response("index.html", locals()) 

Sin embargo, se aplica para el siguiente código:

def index(request): 
    return render_to_response("index.html", locals(), context_instance=RequestContext(request)) 

estaba bajo la impresión de que los procesadores de contexto son aplicado para TODAS las solicitudes, no solo cuando se proporciona context_instance.

¿Cómo hago que mis procesadores de contexto se apliquen a TODAS las solicitudes?

Respuesta

11

Has respondido tu propia pregunta. Se aplica a las respuestas que usan RequestContext. No se aplica a los que no lo hacen.

La forma de aplicarlo a todas las respuestas es asegurarse de utilizar siempre RequestContext. O bien, en Django 1.3+, puede usar el nuevo atajo render en lugar de render_to_response, que crea un RequestContext para usted.

0

Las variables del procesador de contexto solo están disponibles cuando se envía un objeto RequestContext (inicializado con la solicitud actual) a la plantilla como context_instance.

+1

¿Hay algún atajo SECO que pueda usar para evitar la plantilla repetitiva context_instance? Supongo que un escenario bastante común es que le gustaría que las variables del procesador de contexto estén presentes para todas las solicitudes. Diga que todas las vistas incluyen un pie de página que necesita la lista "linked_sites". "linked_sites" sería proporcionado por un procesador de contexto, pero me gustaría evitar rociar mi código con context_instance = RequestContext (solicitud) :-) – knorv

3

Django introdujo un nuevo acceso directo en render Django 1.3 que incluye automáticamente el RequestContext

from django.shortcuts import render 

def my_view(request): 
    # View code here... 
    context = { 
     'some_extra_var_for_template': 'value' 
    } 
    return render(request, 'myapp/index.html', context) 

Usted puede leer sobre él en el Django docs.

Cuestiones relacionadas