Блог
  • Начало
  • Обо мне
  • Обратная связь

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
Select language:
  • Русский
  • English

  • Программирование

    Python C++ JavaScript

    Веб-разработка

    Django ASP.NET

    Мобильная разработка

    Windows Phone Android

    Разработка игр

    Unity3d Blender

    Артем Устимов © 2014