Eu vi jpwatts ' 110.º-J ' s, nivhab 's & Marcus Whybrow ' s respostas, mas todos eles parecem falta em alguma coisa: o que acontece com o caminho da raiz? Por que está sempre ativo?
Então criei uma outra forma, mais fácil, que faz o "controlador" decidir por si mesmo e acho que resolve a maioria dos grandes problemas.
Aqui está minha tag personalizada:
## myapp_tags.py
@register.simple_tag
def nav_css_class(page_class):
if not page_class:
return ""
else:
return page_class
Então, o "controlador" declara as classes CSS necessárias (na verdade, o mais importante é que declara sua presença ao template)
## views.py
def ping(request):
context={}
context["nav_ping"] = "active"
return render(request, 'myapp/ping.html',context)
E, finalmente, eu o renderizo na minha barra de navegação:
<!-- 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>
...
Portanto, cada página tem seu próprio nav_css_class
valor a ser definido e, se for definido, o modelo torna-se ativo: sem necessidade de request
no contexto do modelo, sem pareamento de URL e sem mais problemas com páginas multi-URL ou página raiz.
<a href="{% url "view:name" %}" {% active_class "view:name" %}>
. Você pode opcionalmente usá-lo para gerar apenas o" active"
valor (passandoFalse
como um segundo argumento para a tag) para anexar a um atributo de classe existente, mas para a maioria dos links de navegação, esse exemplo é o que eu uso.