2010-02-11 15 views
59

Tengo un problema extraño, quiero agregar una consulta global utilizando procesadores de contexto. Esta es la forma en que lo hice por following:Django, procesadores de contexto de plantilla

hizo una processor.py en mi aplicación como tal:

from myproject.myapp.models import Foo 

def foos(request): 
    return {'foos': Foo.objects.all()} 

y al final de mi setting.py He añadido este:

TEMPLATE_CONTEXT_PROCESSORS = ('myapp.processor.foos',) 

por último me pasan a mi vista como ésta:

def index_view(request): 

    return render_to_response('index.html', {}, context_instance=RequestContext(request)) 

y en mi plantilla index.html :

<select id="select_foo"> 
{% for foo in foos %} 
    <option value="/{{ foo.slug }}">{{ foo.name }}</option> 
{% endfor %} 
</select> 

Y por último mi url:

(r'^$', 'myapp.views.index_view'), 

Mi pantalla Foos sin ningún problema, sin embargo, mi MEDIA_URL y otros contextos se han ido. Cuál puede ser el problema

Respuesta

53

Cuando se especifica lo siguiente:

TEMPLATE_CONTEXT_PROCESSORS = ('myapp.processor.foos',) 

En el archivo de configuración, está sustituyendo el Django de default context processors. Con el fin de extender la lista, es necesario incluir la falta de pago en la configuración:

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth", 
    "django.core.context_processors.debug", 
    "django.core.context_processors.i18n", 
    "django.core.context_processors.media", 
    "myapp.processor.foos", 
) 

Nota, los ajustes anteriores son los valores por defecto (además de su procesador) para Django 1.1.

+0

I extrañamente no tengo TEMPLATE_CONTEXT_PROCESSORS en mi settings.py, usando el Django 1.1.1 predeterminado y media_url funcionaba bien antes. – Hellnar

+5

Eso es porque si no lo especifica, usa los valores predeterminados especificados en la configuración de djangos. Así es como funcionan todas las configuraciones de django, tienen un valor predeterminado que se usará si no lo tienes en tu 'settings.py'. –

+0

¡Gracias ahora trabajando! Recibí el error, así que eliminé "django.contrib.messages.context_processors.messages", Creo que esto es para la versión de desarrollo de django, no 1.1.1 – Hellnar

6

Aquí lo que funcionó para mí por Django 1,3

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.contrib.messages.context_processors.messages", 
    "myapp.processor.foos",) 
173

es necesario agregar los valores por defecto de TEMPLATE_CONTEXT_PROCESSORS. Sin embargo, en lugar de codificar duro esos valores, que serán ligados a una versión específica de Django, puede anexar su procesador de contexto a los valores predeterminados por el siguiente texto:

from django.conf import global_settings 
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    "myapp.processor.foos", 
) 

Asegúrese de incluir la coma final en la tupla, por lo que Python lo reconoce como una tupla.

+2

¡Gracias por este consejo! Es mucho mejor que la solución más típica que las personas sugieren como la respuesta de TM aquí. Tener que especificar todo el conjunto de valores predeterminados solo para agregar uno siempre me pareció un error, y de hecho lo recuperé cuando me actualicé a django 1.3 y las cosas no funcionaron porque me faltaba el procesador de contexto estático predeterminado. –

+8

Esta es la mejor respuesta, porque seguirá funcionando si cambian los procesadores predeterminados. – Canuck

+2

@Greg Glockner es un gran consejo, pero ¿dónde debería agregar ese código? 'settings.py'? – dialex

Cuestiones relacionadas