Если вы организовали свой проект в шаблон base.html
, который расширен другими шаблонами, например, appname/pagename.html
, вы можете использовать шаблонно-ориентированный подход для выделения активного элемента навигации.
Этот подход дает вам некоторые развязывающие преимущества, которые я подробно отметил в конце этого ответа.
Я обнаружил, что этот подход очень полезен для обработки широких элементов навигации, которые остаются неизменными на большей части или на всем сайте. Возможно, это не подходящее решение для более подробных элементов навигации, таких как рендеринг динамического списка элементов, найденных в вашем хранилище данных.
В шаблоне base.html
добавьте блок к каждому элементу навигации, присваивая блокам уникальные имена:
<ul class="nav">
<li class="{% block navbar_class-home %}{% endblock %}">
<a href="#">Home</a>
</li>
<li class="{% block navbar_class-about %}{% endblock %}">
<a href="#">About</a>
</li>
<li class="{% block navbar_class-pricing %}{% endblock %}">
<a href="#">Pricing</a>
</li>
</ul>
В шаблоне appname/pagename.html
, если вы хотите, чтобы один из элементов nav был активным, переопределите соответствующий блок, используя active
в качестве содержимого. Например, чтобы выделить элемент «О программе»:
{% block navbar_class-about %} current {% endblock %}
Когда вы используете представление, которое отображает этот шаблон, оно будет выглядеть так:
<ul class="nav">
<li class="">
<a href="#">Home</a>
</li>
<li class=" current ">
<a href="#">About</a>
</li>
<li class="">
<a href="#">Pricing</a>
</li>
</ul>
Это обеспечивает начальный рендеринг, который не зависит от JavaScript. (Вы можете изменить классы навигационной панели, используя JavaScript, если вы работаете с одностраничным приложением.)
Во многих (но не во всех) случаях это может быть лучшим разделением представления от логики представления:
Вы можете изменить представления, чтобы присоединить данные навигации сайта к контексту шаблона, но это сильно связывает презентацию со слоем представления и затрудняет создание приложений многократного использования или интеграцию сторонних приложений.
Представление уже выбирает именованный шаблон, что означает, что вы уже передаете некоторую информацию, связанную с навигацией, в слой шаблона. Это может быть все, что вам нужно.
Вы можете использовать процессор контекста шаблона для получения некоторой информации о представлении, но это просто перемещает сильную связь с другим слоем системы, а не остается внутри слоя шаблона.