In my layout.html (sometimes called base.html) I have a navbar like this:
<li class="dropdown"><a href="{% url 'index' %}" >Home </a></li>
<li class="dropdown"><a href="{% url 'house_list' %}">Your houses</a></li>
<li class="dropdown"><a href="{% url 'agency_list' %}">Agencies</a></li>
<li class="dropdown"><a href="/admin">Admin</a></li>
<li class="dropdown"><a href="{% url 'logout' %}"><i class="fa fa-lock"></i> Log ud</a></li>
<li class="dropdown"><a href="{% url 'login' %}"><i class="fa fa-lock"></i> Log ind</a></li>
I would like to highlight the current page in the navbar which is done by changing <li class="dropdown">
to <li class="dropdown active">
Is there a way for Django to insert active for the page the user is on? Any help is much appreciated!
I'm using Django 1.9 and Python 3.5.
You can get the name of the url (referenced in your urlpatterns). Then set the 'active' class if the url matches.
{% with url_name=request.resolver_match.url_name %}
<li class="dropdown {% if url_name == 'index' %}active{% endif %}"
<a href="{% url 'index' %}" >Home </a>
</li>
<li>...</li>
{% endwith %}
I had a simialr question and found that using Djangos templates solved my issue. By creating a 'base' template containing the navbar, leaving the active flag to be populated by each page.
Like this:
base.html file containing this
<li {% block nav_index%}{% endblock %}><a href="{% url 'index' %}" >Home </a></li>
<li {% block nav_house_list%}{% endblock %}><a href="{% url 'house_list' %}">Your houses</a></li>
<li {% block nav_agency_list%}{% endblock %}><a href="{% url 'agency_list' %}">Agencies</a></li>
<li {% block nav_admin%}{% endblock %}><a href="/admin">Admin</a></li>
<li {% block nav_logout%}{% endblock %}><a href="{% url 'logout' %}"><i class="fa fa-lock"></i> Log ud</a></li>
<li {% block nav_login%}{% endblock %}><a href="{% url 'login' %}"><i class="fa fa-lock"></i> Log ind</a></li>
Then referencing that on each page. Inserting 'active' for each url:
{% extends "base.html" %}
{% block nav_index%}
class="active"
{% endblock %}
(replace nav_index for each page)
Django has some good documentation on it: https://docs.djangoproject.com/en/1.7/topics/templates/
When not using a dedicated template tag
for the menu generation, I set the active
menu item class if the view_name
of the current request matches the view_name
of the linked item:
Pseudo code:
<a
class="{% if request.resolver_match.view_name == 'foo' %}active{% endif %}"
href="{% url 'foo' %}"
>Foo</a>
Not very DRY, but when not dealing with a lot of navigation items it does the job:
<a class="nav-item nav-link {% if request.resolver_match.view_name == 'core:dashboard' %}active{% endif %}" href="{% url 'core:dashboard' %}">Dashboard</a>
<a class="nav-item nav-link {% if request.resolver_match.view_name == 'publications:index' %}active{% endif %}" href="{% url 'publications:index' %}">Publications</a>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With