Как передать данные в шаблон, не передавая их через представление?

У меня есть файл base.html, в котором на боковой панели он перебирает все пространства внутри моей модели Spaces и отображает их в виде ссылок. Мне интересно, вместо того, чтобы передавать эти пространства через каждое представление, есть ли способ просто иметь их в базовом шаблоне? Я пробовал искать и наткнулся на теги шаблона, но не думаю, что это то, что мне нужно.

Base.html

<div class="sidenav">
    <h2>Spaces:</h2>
    {% for space in spaces %}
    
    <a href="/{{space}}">{{space}}</a>

    {% endfor %}
</div>

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

Любая помощь будет оценена по достоинству!

Для того чтобы иметь некоторую переменную, глобальную для всех шаблонов, Django предоставляет context processor. Обработчик контекста - это функция Python, которая принимает объект запроса в качестве аргумента и возвращает словарь, который добавляется в контекст запроса.

Вы можете добавить объекты spaces в контекстный процессор следующим образом :

app_name/context_processors.py

from .app_name import Space

def spaces(request):
    # It must return a dictionary don't forget
    return {'spaces': Space.objects.all()}

В вашем контекстном процессоре вы инстанцируете пространство с помощью объекта запроса и делаете его доступным для шаблонов как переменную с именем spaces.

settings.py

Далее необходимо добавить этот пользовательский контекстный процессор в переменную TEMPLATES в settings.py следующим образом :

TEMPLATES = [
     {
         # ...
         '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',

                # Customs
                'app_name.context_processors.space',
                ],
     },
]

template.html. Теперь у вас есть доступ к переменной spaces на всех шаблонах проекта.

<div class="sidenav">
    <h2>Spaces:</h2>

    <!-- spaces variable is in all templates -->
    {% for space in spaces %}

        <a href="/{{space}}">{{space}}</a>

   {% endfor %}
</div>
Вернуться на верх