2010-05-23 2 views
58

Я подошел к точке, где мне нужно передать определенные переменные ко всем моим представлениям (главным образом переменные типа аутентификации).Создание моего собственного процессора контекста в 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") 

ответ

41

Контекст процессора вы написали должны работать. Проблема, на ваш взгляд.

Вы уверены, что ваш вид обрабатывается 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)) 
+1

«context_instance» - это то, чего не хватало! Спасибо TM – dotty

+0

Последующие действия, почему мне нужен этот context_instance? Почему мне это не нужно, если я использую систему авторизации django? – dotty

+0

Встроенные представления Django обрабатывают это для вас (они используют 'RequestContext'). Подумайте о обработчике контекста, который вы создали. В качестве аргумента требуется 'request'. Это означает, что вам нужно каким-то образом предоставить текущий запрос логике рендеринга. 'RequestContext' в основном просто обрабатывает простую логику цикла через все контекстные процессоры и передает текущий запрос им, а затем обновляет контекст страницы с результатами. –

24

Согласно django docs вы можете использовать render в качестве ярлыка вместо render_to_response с context_instance аргументом:

В качестве альтернативы, используйте render() ярлык, который то же, что и вызов render_to_response() с аргументом context_instance, который заставляет использовать RequestContext.

+0

Действительно, в эти дни это возможно. – fabspro

2

Если вы используете render_to_response() ярлык Джанго, чтобы заполнить шаблон с содержимым словаря, ваш шаблон будет передан экземпляр контекста по умолчанию (а не RequestContext). Чтобы использовать RequestContext в вашем рендеринге шаблона, используйте ярлык render(), который совпадает с вызовом render_to_response() с аргументом context_instance, который заставляет использовать RequestContext.