Использование тега шаблона
Вы можете просто использовать следующий тег шаблона:
# path/to/templatetags/mytags.py
import re
from django import template
try:
from django.urls import reverse, NoReverseMatch
except ImportError:
from django.core.urlresolvers import reverse, NoReverseMatch
register = template.Library()
@register.simple_tag(takes_context=True)
def active(context, pattern_or_urlname):
try:
pattern = '^' + reverse(pattern_or_urlname)
except NoReverseMatch:
pattern = pattern_or_urlname
path = context['request'].path
if re.search(pattern, path):
return 'active'
return ''
Итак, у вас ваш шаблон:
{% load mytags %}
<nav><ul>
<li class="nav-home {% active 'url-name' %}"><a href="#">Home</a></li>
<li class="nav-blog {% active '^/regex/' %}"><a href="#">Blog</a></li>
</ul></nav>
Использование только HTML &CSS
Существует другой подход, использующий только HTML и CSS, который вы можете использовать в любых фреймворках или статических сайтах.
Учитывая, что у вас есть такое меню навигации:
<nav><ul>
<li class="nav-home"><a href="#">Home</a></li>
<li class="nav-blog"><a href="#">Blog</a></li>
<li class="nav-contact"><a href="#">Contact</a></li>
</ul></nav>
Создайте несколько базовых шаблонов, по одному для каждой сессии вашего сайта, например:
home.html
base_blog.html
base_contact.html
Все эти шаблоны расширяют base.html
с помощью block"section",как, например:
...
<body id="{% block section %}section-generic{% endblock %}">
...
Затем, взяв base_blog.html
в качестве примера, вы должны иметь следующее:
{% extends "base.html" %}
{% block section %}section-blog{% endblock %}
Теперь легко определить пункт меню actived с помощью CSSтолько:
#section-home .nav-home,
#section-blog .nav-blog,
#section-contact .nav-contact { background-color: #ccc; }