Создание собственного обработчика контекста в 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",
"django.contrib.messages.context_processors.messages",
"sandbox.context_processors.say_hello",
)
Как вы можете видеть, у меня есть модуль под названием "context_processors" и функция внутри того, что называется say_hello.
Что выглядит как
def say_hello(request):
return {
'say_hello':"Hello",
}
Можно ли предположить, что теперь я могу сделать следующее в своих представлениях?
{{ say_hello }}
Прямо сейчас это ничего не делает в моем шаблоне.
Мое мнение выглядит как
from django.shortcuts import render_to_response
def test(request):
return render_to_response("test.html")
Ответы
Ответ 1
Обработчик контекста, который вы написали, должен работать. Проблема в вашем понимании.
Вы уверены, что ваше представление отображается с помощью RequestContext
?
Например:
def test_view(request):
return render_to_response('template.html')
В приведенном выше представлении не будут использоваться контекстные процессоры, перечисленные в TEMPLATE_CONTEXT_PROCESSORS
. Убедитесь, что вы поставляете RequestContext
следующим образом:
def test_view(request):
return render_to_response('template.html', context_instance=RequestContext(request))
Ответ 2
В соответствии с django docs вы можете использовать render
как ярлык вместо render_to_response с аргументом context_instance:
В качестве альтернативы используйте ярлык render()
, который является тем же самым, что и вызов render_to_response() с аргументом context_instance, который заставляет использовать RequestContext.
Ответ 3
Если вы используете ярлык Djangos render_to_response()
для заполнения шаблона содержимым словаря, ваш шаблон будет передан экземпляр контекста по умолчанию (а не RequestContext
). Чтобы использовать RequestContext
в рендеринге шаблона, используйте ярлык render()
, который совпадает с вызовом render_to_response()
с аргументом context_instance
, который заставляет использовать RequestContext
.