пятница, 5 апреля 2013 г.

Template context processor для создания меню в Django

Для создания меню в Django можно использовать контекстный процессор - template context processor.
Он позволяет передавать в шаблон определенную вами переменную.
Пусть у нас есть модель статей Article. Каждая статья имеет категорию Category. Мы хотим, чтобы на каждой странице выводился список из категорий, представляющий собой меню. При клике на категорию мы переходим на страницу со списком статей данной категории.


1. Для использования контекстного процессора создадим в корне нашего проекта папку context_processors. В ней создадим пустой файл __init__.py, чтобы python знал, что эта папка является модулем. Также создадим файл main_menu.py, куда мы поместим наш контекстный процессор:
from django.core.context_processors import request

def menu(request):
    return {"var" : "It is my var 1 from template context processor!",
            "var2" : "Second var"}
Обратите внимание, что контекстный процессор должен возвращать словарь.
2. В настройках проекта settings.py добавим к стандартным контекстным процессорам наш контекстный процессор:

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",
    
    "context_processors.main_menu.menu",
)



3. После этого в шаблонах можно будет обращаться к нашим переменным так: {{ var }}, {{ var2 }}.

4. Никто нам не мешает импортировать в контекстный процессор модель, достать нужные объекты и поместить их в переменную, которая будет доступна в шаблонах. Вот так будет выглядеть функция контекстного процессора для формирования меню.
from django.core.context_processors import request

#Импортируем модель категорий
from article.models import Category

def menu(request):

    category_list = Category.objects.all()    

    return {"category_list":category_list}


Комментариев нет:

Отправить комментарий