Повторное использование контекста в нескольких представлениях
Я очень новичок в Django и в моем приложении у меня есть динамическая панель навигации сверху. Контекст передается как контекст. Представьте, что это выглядит следующим образом:
<ul>
{% for link in links %}
<li><a href="{{ link }}"></a></li>
{% endif %}
</ul>
Представления могут выглядеть следующим образом:
def nav_links():
# Display links to first 5 MyModel objects
objects = MyModel.objects.all()[:5]
return [o.get_absolute_url() for o in objects]
def index(request):
return render("request", "app/index.html", context={"links": nav_links()})
def page1(request)
some_data = ...
return render("request", "app/page1.html", context={"links": nav_links(), "data": some_data})
def page2(request)
return render("request", "app/page2.html", context={"links": nav_links()})
...
В настоящее время мне нужно передавать links
в качестве контекста в каждом представлении. Это, очевидно, плохой дизайн.
Есть ли способ передать один и тот же контекст для всех представлений?
Вы можете работать с контекстным процессором, это функция, которая каждый раз запускается для заполнения контекста. Такой контекстный процессор выглядит как ваш nav_links
, за исключением того, что это должен быть словарь с именем(ями) переменной(ых) и соответствующим значением(ями):
# app_name/context_processors.py
def links(request):
from app_name.models import MyModel
objects = MyModel.objects.all()[:5]
return {'links': [o.get_absolute_url() for o in objects]}
Затем вы можете зарегистрировать контекстный процессор в settings.py
с помощью:
# settings.py
# …
TEMPLATES = [
{
# …,
'OPTIONS': {
'context_processors': [
# …,
'app_name.context_processors.links'
],
},
},
]