Программы
Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

В Django вы можете передавать данные в шаблоны посредством контекстов. Контекст передаётся из контроллера (view в терминах Django), однако, если одни и те же данные нужны в разных местах, лучше сделать свой контекст-процессор.

В проектах на Django часто взаимодействие с пользователем осуществляется через отрендеренные html-шаблоны. Да, есть вариант поставить один из модулей rest-*, которые обеспечат интерфейс взаимодействия через json... Но в основной массе используется всё же HTML интерфейс.

И чтобы отрендерить шаблон, нам нужно непосредственно описать сам шаблон, а также передать в него информацию, которая будет вставлена в указанные места. Передать контекст. И помимо того, что можно передать непосредственно из view (контроллера), в контексте шаблона присутствуют и другие переменные, например messages, user. Если приглядеться в settings.py, то можно увидеть, как они добавляются в наши шаблоны:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [f'{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',  # <---
            ],
        },
    },
]

То есть, если мы, например, хотим на всех страницах выводить плашку с последними опубликованными заметками, нам нужно либо во всех view их получать, либо же написать свой контекстный процессор. Именно это мы сейчас и сделаем.

Для начала создадим модуль, в котором будем писать его (в Django приложении post):

post
├───context_processors
     ├──post_context.py
     ├──__init__.py

Сам же контекстный процессор имеет крайне простой интерфейс - это функция, которой на вход передаётся request, а возвращается словарь с переменными контекста, которые надо добавить.

Напишем свой контекстный процессор в модуле post.context_processors.post_context:

from post.models import Post


def last_posts(request):
    posts = Post.objects.order_by('-published')[:10]
    return {
        'last_posts': posts
    }

После чего добавим его в список контекст-процессоров в файле настроек settings.py:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [f'{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',
                'post.context_processors.post_context.last_posts',  # Добавили эту строку
            ],
        },
    },
]

После чего можно в любом шаблоне уже использовать эту переменную:

...
{% for post in last_posts %}
    {{post}}
{% endfor %}
...

Теперь вы можете в Django проекте добавить любую переменную шаблона на свой вкус!

Если интересно, что дальше - читайте рубрику Django.

Также может быть вам интересно:

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.

Читать »

Microsoft открывает исходники, а её IDE супер-популярна

Решил сложить пару фактов и немного над этим поразмыслить. Реально ли Microsoft "переобулись"?

Читать »
Фото Как настроить отправку почты из Django

Как настроить отправку почты из Django

Письма об ошибках, отчёты на почту, восстановление паролей - всё это полезно при работе с сайтом. Django предоставляет удобный способ это сделать с минимумом настроек!

Фото Добавляем поддержку медиа-файлов в Django проект

Добавляем поддержку медиа-файлов в Django проект

Современные сайты редко ограничиваются только текстом и вёрсткой. Часто в заметках красуются фотографии, а рядом с описанием товаров - их изображения.

Фото Настройка журналирования (логирования) в Python с примерами

Настройка журналирования (логирования) в Python с примерами

Во время работы программы часто нужно сохранять некоторые важные записи о процессе выполнения команды. В Python есть довольно мощный модуль для работы с логами - давайте разберёмся с тем, как его использовать.

Фото Шаблон разработки ПО — Model View Controller (MVC)

Шаблон разработки ПО — Model View Controller (MVC)

MVC - один из самых распространённых архитектурных шаблонов разработки. Часто используется в различных фреймворках. В том числе и в Django.

Фото Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.

Фото Разграничение прав доступа на Django сайте

Разграничение прав доступа на Django сайте

Почти на любом веб-сайте необходимо разделять пользователей на группы и предоставлять им разные возможности. В Django есть довольно серьёзная система прав доступа для пользователей - давайте её рассмотрим!

Фото Пользователи и их создание в Django - своя регистрация на сайте

Пользователи и их создание в Django - своя регистрация на сайте

Если вашим сайтом должны активно пользоваться несколько человек, то полезно их различать, а значит - надо уметь создавать пользователей, либо предоставлять возможность регистрации Django пользователей.

Фото Как на Bash посчитать число строк в проекте (директории)

Как на Bash посчитать число строк в проекте (директории)

Ниже будет представлен однострочник, решающий данную задачу на Bash + пошаговое описание его работы.