Я видел ответы jpwatts ', 110j ' s, nivhab 's и Marcus Whybrow , но всем им, кажется, чего-то не хватает: а как насчет корневого пути? Почему он всегда активен?
Итак, я сделал другой способ, более простой, который позволяет «контроллеру» решать сам, и я думаю, что он решает большинство больших проблем.
Вот мой собственный тег:
## myapp_tags.py
@register.simple_tag
def nav_css_class(page_class):
if not page_class:
return ""
else:
return page_class
Затем «контроллер» объявляет необходимые классы CSS (на самом деле, самое главное, он заявляет о своем присутствии в шаблон)
## views.py
def ping(request):
context={}
context["nav_ping"] = "active"
return render(request, 'myapp/ping.html',context)
И, наконец, я визуализирую его на панели навигации:
<!-- sidebar.html -->
{% load myapp_tags %}
...
<a class="{% nav_css_class nav_home %}" href="{% url 'index' %}">
Accueil
</a>
<a class="{% nav_css_class nav_candidats %}" href="{% url 'candidats' %}">
Candidats
</a>
<a class="{% nav_css_class nav_ping %}" href="{% url 'ping' %}">
Ping
</a>
<a class="{% nav_css_class nav_stat %}" href="{% url 'statistiques' %}">
Statistiques
</a>
...
Таким образом, каждая страница имеет собственное nav_css_class
значение, которое нужно установить, и если оно установлено, шаблон становится активным: нет необходимости request
в контексте шаблона, нет парсинга URL-адресов и больше нет проблем с страницами с несколькими URL-адресами или корневой страницей.
<a href="{% url "view:name" %}" {% active_class "view:name" %}>
. При желании вы можете использовать его для генерации только на" active"
значении (путем передачи вFalse
качестве второго аргумента тега) для добавления к существующему атрибуту класса, но для большинства навигационных ссылок, например , что я использую.