Что такое контекстный процессор (context processor) в Django?

Ответ

Контекстный процессор (context processor) в Django — это функция, которая добавляет дополнительные данные в контекст всех шаблонов, обрабатываемых Django. Это позволяет избежать дублирования кода при передаче одних и тех же переменных в каждый шаблон вручную.

Зачем использовать? Контекстные процессоры идеально подходят для глобальных данных, которые должны быть доступны в любом шаблоне вашего проекта, например:

  • Настройки сайта (название, URL)
  • Информация о текущем пользователе (если не используется auth контекстный процессор по умолчанию)
  • Содержимое корзины покупок
  • Глобальные навигационные элементы

Пример создания и регистрации:

  1. Создайте файл context_processors.py в вашем приложении (например, myapp/context_processors.py):

    # myapp/context_processors.py
    def site_info(request):
        """Добавляет глобальную информацию о сайте в контекст шаблонов."""
        return {
            'SITE_NAME': 'Мой Замечательный Сайт',
            'SITE_URL': 'https://example.com',
            'CURRENT_YEAR': 2023 # Пример динамического значения
        }
  2. Зарегистрируйте процессор в settings.py в секции TEMPLATES:

    # settings.py
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            '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',
                    # Ваш кастомный контекстный процессор
                    'myapp.context_processors.site_info',
                ],
            },
        },
    ]

Использование в шаблоне: После регистрации, переменные SITE_NAME, SITE_URL и CURRENT_YEAR будут доступны в любом шаблоне:

<!-- base.html или любой другой шаблон -->
<footer>
    <p>&copy; {{ CURRENT_YEAR }} {{ SITE_NAME }}. Все права защищены.</p>
    <p>Посетите нас: <a href="{{ SITE_URL }}">{{ SITE_URL }}</a></p>
</footer>

Важное замечание: Контекстные процессоры выполняются для каждого запроса. Избегайте добавления в них тяжеловесной логики или запросов к базе данных, которые могут замедлить работу вашего приложения.