creando mi propio procesador de contexto en django

81

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")
punteado
fuente

Respuestas:

54

El procesador de contexto que ha escrito debería funcionar. El problema está en tu opinión.

¿Está seguro de que se está renderizando su vista RequestContext?

Por ejemplo:

def test_view(request):
    return render_to_response('template.html')

La vista anterior no utilizará los procesadores de contexto enumerados en TEMPLATE_CONTEXT_PROCESSORS. Asegúrese de proporcionar un RequestContextsimilar:

def test_view(request):
    return render_to_response('template.html', context_instance=RequestContext(request))
TM.
fuente
1
¡La 'context_instance' es lo que faltaba! Gracias TM
dotty
Seguimiento, ¿por qué necesito esta context_instance? ¿Por qué no necesito esto si uso el sistema de autenticación de django?
dotty
1
Las vistas integradas de Django manejan esto por usted (usan a RequestContext). Piense en el procesador de contexto que hizo. Toma requestcomo argumento. Eso significa que de alguna manera necesita dar la solicitud actual a la lógica de renderizado. RequestContextbá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.
TM.
¿Puedo modificar mi vista para solicitar el contexto?
dotty
3
@TM. return render_to_response('template.html', context_instance=RequestContext(request))es viejo fasion, creo que return render(request,'template.html')es más seco
suhailvs
29

De acuerdo con los documentos de django , puede usarlo rendercomo un atajo en lugar de render_to_response con el argumento context_instance:

Alternativamente, use el render()atajo que es lo mismo que una llamada a render_to_response () con un argumento context_instance que fuerza el uso de RequestContext.

nulse
fuente
De hecho, en estos días eso es posible.
fabspro
9

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 wwwencontext_processors.py

andilabs
fuente
2

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 a RequestContext). Para usar un RequestContexten la representación de su plantilla, use el render()atajo que es el mismo que una llamada a render_to_response()con un context_instanceargumento que fuerza el uso de un RequestContext.

GrvTyagi
fuente