створення мого власного контекстного процесора в django


81

Я дійшов до того моменту, коли мені потрібно передати певні змінні всім своїм переглядам (переважно змінні типу власного типу автентифікації).

Мені сказали, що найкращим способом це зробити написання власного контекстного процесора, але у мене є деякі проблеми.

Файл моїх налаштувань виглядає так

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")

Відповіді:


54

Процесор контексту, який ви написали, повинен працювати. Проблема на ваш погляд.

Чи впевнені ви у тому, що ваш погляд подається 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'! Дякую ТМ
dotty

Подальші дії, як це мені потрібне це context_instance? Як мені це не потрібно, якщо я використовую систему автентифікації django?
dotty

1
Вбудовані представлення Django вирішують це для вас (вони використовують a RequestContext). Подумайте про створений вами контекстний процесор. Це приймається requestяк аргумент. Це означає, що вам потрібно якось передати поточний запит логіці візуалізації. RequestContextв основному просто обробляє просту логіку перегляду всіх процесорів контексту та передачі поточного запиту їм, а потім оновлення контексту сторінки з результатами.
ТМ.

Чи можу я змінити своє подання для запиту контексту?
крапка

3
@TM. return render_to_response('template.html', context_instance=RequestContext(request))це старий фасон, я думаю, return render(request,'template.html')це більше
СУХО

29

Згідно з документами django, ви можете використовувати renderярлик замість render_to_response з аргументом context_instance:

Крім того, використовуйте render()ярлик, який є таким самим, як виклик render_to_response () з аргументом context_instance, який змушує використовувати RequestContext.


Дійсно, в наші дні це можливо.
fabspro

9

З 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

Якщо ви використовуєте render_to_response()ярлик Django для заповнення шаблону вмістом словника, ваш шаблон за замовчуванням передаватиме екземпляр контексту (а не a RequestContext). Щоб використовувати a RequestContextу візуалізації вашого шаблону, скористайтесь render()ярликом, який є тим самим, що і виклик до render_to_response()з context_instanceаргументом, що змушує використовувати a RequestContext.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.