He visto las respuestas de jpwatts ', 110j 's, nivhab ' s y Marcus Whybrow , pero todas parecen carecer de algo: ¿qué pasa con la ruta raíz? ¿Por qué siempre está activo?
Así que hice otra manera, más fácil, que hace que el "controlador" decida por sí mismo y creo que resuelve la mayoría de los grandes problemas.
Aquí está mi etiqueta personalizada:
## myapp_tags.py
@register.simple_tag
def nav_css_class(page_class):
if not page_class:
return ""
else:
return page_class
Luego, el "controlador" declara las clases CSS necesarias (de hecho, lo más importante es que declara su presencia en la plantilla)
## views.py
def ping(request):
context={}
context["nav_ping"] = "active"
return render(request, 'myapp/ping.html',context)
Y finalmente, lo renderizo en mi barra de navegación:
<!-- 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>
...
Entonces, cada página tiene su propio nav_css_class
valor para configurar, y si está configurado, la plantilla se vuelve activa: no es necesario request
en el contexto de la plantilla, no hay parcelación de URL y no más problemas con las páginas de múltiples URL o la página raíz.
<a href="{% url "view:name" %}" {% active_class "view:name" %}>
. Opcionalmente, puede usarlo para generar solo el" active"
valor (pasandoFalse
como un segundo argumento a la etiqueta) para agregarlo a un atributo de clase existente, pero para la mayoría de los enlaces de navegación, ese ejemplo es el que uso.