Создание моего собственного контекстного процессора в Django - PullRequest
72 голосов
/ 24 мая 2010

Я пришел к тому, что мне нужно передать определенные переменные всем моим представлениям (в основном переменным типа пользовательских аутентификаций).

Мне сказали, что написание собственного контекстного процессора - лучший способ сделать это, но у меня есть некоторые проблемы.

Мой файл настроек выглядит следующим образом

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 ]

48 голосов
/ 24 мая 2010

Обработчик контекста, который вы написали, должен работать.Проблема в вашем представлении.

Вы уверены, что ваше представление отображается с 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))
28 голосов
/ 24 октября 2012

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

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

9 голосов
/ 20 марта 2018

Начиная с 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 в context_processors.py

2 голосов
/ 11 февраля 2015

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

...