Как выделить активный пункт меню?

Когда мы создаем веб-приложение с помощью Django, часто возникает необходимость выделить активный пункт меню на основе текущего URL-адреса или других условий.

Существует несколько способов реализации этой функциональности в Django. Вот некоторые из них:

1. Использование контекстных переменных в шаблоне:
Один из самых простых способов выделить активный пункт меню - это передать контекстную переменную в шаблон, которая будет содержать информацию о текущем URL-адресе. Затем в самом шаблоне можно использовать условные операторы, чтобы определить, какой пункт меню должен быть активным на основе этой информации. Например, если у нас есть строка URL-адреса в виде request.path, мы можем сравнивать ее с ожидаемым URL-адресом и выделять активный пункт меню.

Пример кода в шаблоне base.html:

   <ul>
     <li{% if request.path == "/" %} class="active"{% endif %}><a href="/">Главная</a></li>
     <li{% if request.path == "/about/" %} class="active"{% endif %}><a href="/about/">О нас</a></li>
     <li{% if request.path == "/contact/" %} class="active"{% endif %}><a href="/contact/">Контакты</a></li>
   </ul>

В этом примере используется условный оператор {% if %}, чтобы добавить класс активного пункта меню, если текущий URL-адрес совпадает с ожидаемым адресом.

2. Использование тегов шаблонов:
Другим способом является создание собственных тегов шаблонов в Django. Теги шаблонов позволяют добавлять собственную логику в шаблоны Django. Мы можем создать тег шаблона, который будет принимать текущий URL-адрес в качестве аргумента и возвращать соответствующий класс активного пункта меню.

Ниже приведен пример кода для создания тега шаблона is_active:

   from django import template

   register = template.Library()

   @register.simple_tag
   def is_active(current_url, expected_url):
       if current_url == expected_url:
           return "active"
       return ""

Затем в шаблоне мы можем использовать этот тег шаблона следующим образом:

   {% is_active request.path "/" as home_active %}
   {% is_active request.path "/about/" as about_active %}
   {% is_active request.path "/contact/" as contact_active %}

   <ul>
     <li class="{{ home_active }}"><a href="/">Главная</a></li>
     <li class="{{ about_active }}"><a href="/about/">О нас</a></li>
     <li class="{{ contact_active }}"><a href="/contact/">Контакты</a></li>
   </ul>

Этот пример использует тег {% is_active %} для определения активного класса пункта меню и сохранения его в контекстной переменной.

3. Использование классов представлений:
Если мы используем классы представлений в Django, мы можем использовать атрибуты классов представлений для выделения активного пункта меню. Класс представления может содержать атрибут active_menu, который будет устанавливаться в True для активного представления.

Например, для класса представления HomeView:

   from django.views.generic import TemplateView

   class HomeView(TemplateView):
       template_name = "home.html"
       active_menu = True  # активный пункт меню

Затем в шаблоне мы можем проверять значение атрибута active_menu для каждого пункта меню:

   <ul>
     <li{% if view.active_menu %} class="active"{% endif %}><a href="/">Главная</a></li>
     <li{% if view.active_menu %} class="active"{% endif %}><a href="/about/">О нас</a></li>
     <li{% if view.active_menu %} class="active"{% endif %}><a href="/contact/">Контакты</a></li>
   </ul>

В этом примере мы использовали условный оператор {% if %}, чтобы добавить класс активного пункта меню, если атрибут active_menu класса представления установлен в True.

Это несколько способов выделить активный пункт меню в Django. Каждый из этих способов имеет свои преимущества и недостатки, и выбор конкретного способа зависит от требований вашего проекта и собственных предпочтений.