Django: контекстные процессоры или добавление контекстных данных на все страницы
Дата и время: 23 января 2015 г. 23:03 | Категория: Веб-разработка, Django
Часто бывают случаи, когда какой-либо динамический элемент должен присутствовать на всех страницах сайта. Например, это может быть опрос или меню. Для решения данной проблемы в Django существуют контекстные процессоры.
На первый взляд, поставленную задачу можно решить простым добавлением нужных данных в контекст каждого представления, но в то же время очевидно, что это долго и не практично. Не говоря уже о сложности поддержки данного решения.
В данном случае на помощь приходят контекстные процессоры. По сути они делают то же самое, что указано выше, но описать добавляемые данные придётся всего в одном месте, а не в каждом представлении.
Допустим, нам необходимо добавить на все страницы сайта меню, которое можно редактировать из панели администратора. Ясно, что меню должно подгружаться динамически, т. к. в любой момент может быть изменено. Пусть в меню будут отображаться какие-либо категории. Опишем для этого следующий контекстный процессор, который можно разместить в любом файле в папке с нашим приложением (например, context_processors.py):
from store.models import Category
def category(request):
return {"category_list": Category.objects.all()}
Как видно, контекстный процессор должен просто возвращать словарь с данными, которые необходимо добавить в контекст страниц. В данном случае - все категории.
Далее, необходимо указать наш контекстный процессор в settings.py. По умолчанию кортеж с контекстными процессорами не указан в настройках, не смотря на то, что работают некоторые стандартные из них. Чтобы не нарушить работу фреймворка, необходимо указать и их (прим. указаны контекстные процессоры для Django 1.7.2, для вашей версии уточняйте в документации):
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.core.context_processors.static',
'django.core.context_processors.tz',
'django.contrib.messages.context_processors.messages',
# Наш контекстный процессор
'store.context_processors.category',
)
На этом всё. Теперь из любого шаблона можно будет получить доступ к списку категорий через переменную {{ category_list }}.
comments powered by Disqus