Как передать данные в шаблон, не передавая их через представление?
У меня есть файл 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>