Django, шаблонные контекстные процессоры - PullRequest
59 голосов
/ 11 февраля 2010

У меня странная проблема, я хочу добавить глобальный запрос, используя контекстные процессоры. Вот как я это сделал, после :

сделал файл CPU.py в моем приложении следующим образом:

from myproject.myapp.models import Foo

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

и в конце моего setting.py я добавил это:

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

Наконец, я передаю свое мнение так:

def index_view(request):

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

и в моем шаблоне index.html:

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

И, наконец, мой URL:

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

Мой foos отображается без проблем, но мой media_url и другие контексты пропали. В чем может быть проблема

Ответы [ 3 ]

175 голосов
/ 10 февраля 2012

Вам необходимо добавить значения по умолчанию TEMPLATE_CONTEXT_PROCESSORS. Однако вместо жесткого кодирования тех значений, которые будут привязаны к конкретной версии Django, вы можете добавить свой процессор контекста к значениям по умолчанию следующим образом:

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

Обязательно включите запятую в кортеж, чтобы Python распознал его как кортеж.

53 голосов
/ 11 февраля 2010

Когда вы указываете это:

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

В вашем файле настроек вы переопределяете стандартные контекстные процессоры Django . Чтобы расширить список, вы должны включить в свои настройки настройки по умолчанию:

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",
)

Обратите внимание, что вышеуказанные настройки являются настройками по умолчанию (плюс ваш процессор) для django 1.1.

6 голосов
/ 19 июня 2011

Вот что у меня сработало для 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", )
...