Почему этот процессор контекста шаблона Django не применяется для всех запросов? - PullRequest
5 голосов
/ 11 июля 2011

Я столкнулся со следующей проблемой процессора контекста шаблона Django.

Контекстный процессор определен в myapp/context_processors.py:

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

Он подключен в settings.py вместе со стандартными контекстными процессорами 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',
)

Проблема, с которой я сталкиваюсь, заключается в том, что my_context_processor применяется не для всех запросов.

Это не применяется для следующего кода:

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

Однако применяется для следующего кода:

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

У меня сложилось впечатление, что контекстные процессоры применяются ко ВСЕМ запросам, а не только когда предоставляется context_instance.

Как заставить мои контекстные процессоры применяться ко ВСЕМ запросам?

Ответы [ 3 ]

11 голосов
/ 11 июля 2011

Вы ответили на свой вопрос. Он применяется к ответам, которые используют RequestContext. Это не относится к тем, кто этого не делает.

Способ применить его ко всем ответам - убедиться, что вы всегда используете RequestContext. Или в Django 1.3+ вы можете использовать новый ярлык render вместо render_to_response, который создаст для вас RequestContext.

3 голосов
/ 11 июля 2011

Django представил новый ярлык render в Django 1.3, который автоматически включает 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)

Вы можете прочитать об этом в Django документах .

0 голосов
/ 11 июля 2011

Переменные контекстного процессора доступны только при отправке объекта RequestContext (инициализированного с текущим запросом) в шаблон как context_instance.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...