19 сентября 2016 г. 0:15

234

Меню для django сайта.

Как-то мне понадобилось реализовать меню на сайте, где пункты меню брались из базы данных. На сайтах, которые я ранее писал на php это реализовывалось довольной легко, а вот на django я сразу не мог это реализовать. Самый топорный , это конечно же передавать пункты меню в шаблон в каждой вьюхе )) Но погуглив , я понял, что это реализуется довольно легко с помощью context processors. Но для новичков ,это вначале проблематично и поэтому это статья для них. Есть еще другой способ , который реализуется с помощью template tags , но об этом как-нибудь следующий раз В файле settings.py в секции TEMPLATES перечислены context_processors . которые используются по умолчанию.

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, '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',
            ],
        },
    },
]
Кроме этого RequestContext всегда использует django.core.context_processors.csrf. Этот процессор контекста используется для безопасности админкой и другими встроенными приложениями. Чтобы исключить его случайное отключение, он захардкоден и не может быть выключен с помощью настройки TEMPLATE_CONTEXT_PROCESSORS. То есть все те context_processors , которые перечислены мы можем отключать(но соотвественно это может привести к проблемам). Мы также можем добавлять свои context_processors ,и переменные определенные в них будут доступны во всем приложении. Кстати, нужно быть внимательным, так как мы можем затереть , переменные которые используются до этого. В приложении pages создадим файл context_processor.py и напишем туда следуюший код

from django.core.context_processors import request
from pages.models import Menu

def menu(request):
    menu_list = Menu.objects.all()
    return {'menu_list': menu_list}


Код довольно простой. Единственное обратите внимание , мы должны импортировать request из django.core.context_processors. Это наш простой контекстный процессор. Теперь мы этот контекстный процессор должны зарегистрировать в нашем приложении. Для этого мы в файле settings добавляем наш только что написанный контекстный процессор

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, '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',
                'pages.context_processors.menu',
            ],
        },
    },
]
И теперь переменная menu_list у нас будет доступна во всем сайте. Заключение Это простая реализация контекстного процессора , которая решает нам нашу проблему. Если будут вопросы , то с радостью отвечу на них Критика и пожелания приветствуются
comments powered by Disqus