Ho visto le risposte di jpwatt , 110j , nivhab e Marcus Whybrow , ma sembra che a tutte manchi qualcosa: che dire del percorso di root? Perché è sempre attivo?
Quindi ho creato un altro modo, più semplice, che fa sì che il "controller" decida da solo e penso che risolva la maggior parte dei grandi problemi.
Ecco il mio tag personalizzato:
## myapp_tags.py
@register.simple_tag
def nav_css_class(page_class):
if not page_class:
return ""
else:
return page_class
Quindi, il "controller" dichiara le classi CSS necessarie (infatti, la cosa più importante è che dichiara la sua presenza al template)
## views.py
def ping(request):
context={}
context["nav_ping"] = "active"
return render(request, 'myapp/ping.html',context)
E infine, lo visualizzo nella mia barra di navigazione:
<!-- 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>
...
Quindi ogni pagina ha il suo nav_css_class
valore da impostare e, se è impostato, il modello diventa attivo: non c'è bisogno di un request
contesto di modello, nessun parsing dell'URL e niente più problemi con le pagine multi-URL o la pagina principale.
<a href="{% url "view:name" %}" {% active_class "view:name" %}>
. Puoi opzionalmente usarlo per generare solo il" active"
valore (passandoFalse
come secondo argomento al tag) da aggiungere a un attributo di classe esistente, ma per la maggior parte dei collegamenti di navigazione questo esempio è quello che uso.