Задать вопрос
@dimash07

Как отправить переменную в template Django?

Доброго времени суток! Помогите плз решить проблемку!!!
Есть шаблон main.html, там есть сайдбар (sidebar.html) со списком автомобилей, который показывается в зависимости от открытого автомобиля, а если это главная страница то выводить последние три например, то есть мне нужно туда передавать какую то переменную. Как можно отправить переменную в sidebar.html? Да, есть возможность конечно же в каждой вьюшке прописывать, отправлять данные, но можно ли как то это автоматизировать? То есть в какой то глобальной переменной прописал, либо задать логику для сайдбара.
И есть ли какая либо возможность прописать логику для сайдбара? То есть чтобы у него был свой класс. Я так понимаю делать запросы внутри шаблона - плохая практика.
  • Вопрос задан
  • 990 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
syschel
@syschel
freelance/python/django/backend
Два варианта вижу я:
1. Работать через context_processors. Создать свой класс процессора и добавить его в сеттинги. Тогда он будет на любой странице срабатывать. Внутри уже этого процессора обрабатывать урлы и так далее.
context_processors.py
from django.core.context_processors import request
def sidebar(request):
    return {'context_auto': ...}

settings.py
TEMPLATES = [
    { ...,
        'OPTIONS': {
            'context_processors': [
                        "context_processors.sidebar",
            ],
        },
    },
]

В любом шаблоне теперь будет доступна переменная "context_auto" вызывать можно {{ context_auto }} или передавать.

2. Другой вариант. Использовать Inclusion tags, а не{% include "sidebar.html" %} и через него выводить свой sidebar. То есть вы создаёте функцию, в которой прописываете логику и загрузку sidebar.html а на странице уже инклудите именно функцию, а не html
templatetags/inclusion_tag.py
@register.inclusion_tag('sidebar.html', takes_context=True)
def sidebar(context):
    return ...

В main.html пишем
{% sidebar %}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы