создание собственного контекстного процессора в 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 62

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 in context_processors.py

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