создание собственного контекстного процессора в 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")
4 ответа:
контекстный процессор, который вы написали, должен работать. Проблема заключается в вашем представлении.
вы уверены, что ваш взгляд отображается с
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))
по словам django docs можно использовать
render
в качестве ярлыка вместо render_to_response с аргументом context_instance:или
render()
ярлык, который совпадает с вызовом render_to_response () с аргументом context_instance, который заставляет использовать RequestContext.
С Django 1.8 вы регистрируете свои пользовательские контекстные процессоры следующим образом:
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', ], }, }, ]
предполагая, что ваш контекстный процессор находится в приложении
www
incontext_processors.py
если вы используете ярлык для заполнения шаблона содержимым словаря, ваш шаблон будет передан экземпляр контекста по умолчанию (не
RequestContext
). Чтобы использоватьRequestContext
в вашем шаблоне рендеринга, используйтеrender()
ярлык, который совпадает с вызовомrender_to_response()
сcontext_instance
аргумент, который заставляет использоватьRequestContext
.