- PVSM.RU - https://www.pvsm.ru -
Наверно в каждом проекте есть система навигации — пользователи кликают по ссылкам, менюшкам и нам(разработчикамдизайнерамверстальщикам) надо как-то «подсвечивать» страницуссылку на которой сейчас находится пользователь.
Предоставляю не тривиальное решение очень тривиальной задачи при разработки навигации в Django проектах.
Для не терпеливых можно сразу взглянуть на проект на github [1].
В каждой вьюхе в контексте передаем некую переменную, пусть будет «location» и потом беспощадно хардкодим:
<ul>
<li {% if location=='random_page' %} class="active" {% endif %}>
<a href="{% url 'random_page' %}">
{% trans 'random page' %}
</a>
</li>
</ul>
Получается — к каждой ссылки уникальное значение «location», что порождает очень много лишнего кода, когда ссылоквьюх становится много практически не возможно запомнить какой «location» к какой ссылке, а так же верстальщик может быть крайне не доволен необходимостью вникать в логику питоновских вьюх и какое значение от куда попадает в контекст.
Можно передавать «location» такой же как именная ссылка данной вьюхи и навигация станет слегка наглядней.
собственно фильтр:
from django import template
register = template.Library()
def active(url, request):
if url == request.get_full_path():
return True
else:
return False
register.filter('active', active)
дальше в шаблоне:
{% load active %}
<ul>
{% url 'random_page' as random_page %}
<li {% if random_page|active:request %} class="active" {% endif %}>
<a href="{{ random_page }}">
{% trans 'random page' %}
</a>
</li>
</ul>
Передавать переменные с вьюх уже не нужно, можно заменить сравнение на .startswith() или вовсе на регулярки и добавить поддержу меню, например светить ссылку на "/menu/" когда пользователь находится на странице "/menu/submenu/". Но рутина никуда не делась…
Рутинные действия напрочь отсутствуют, а именно:
{% load activeurl %}
{% activeurl %}
<ul>
<li>
<a href="{% url 'random_page' %}">
{% trans 'random page' %}
</a>
</li>
</ul>
{% endactiveurl %}
немного магии…
<ul>
<li class="active">
<a href="/random_page/">
random page
</a>
</li>
</ul>
Установка как и у всех питоновских батареек:
pip install django-activeurl
Все нюансы описаны тут [2].
Теперь, немного о том как всё это работает — из переданного html с помощью lxml [3] строится дерево, в нем идет поиск HTML элементов которые надо подсветить(по умолчанию «li»), потом в этом тэге берутся все ссылки и их параметр «href» сравнивается с «request.get_full_path()».
Реализованные фичи:
Поменьше всем рутинных задач при разработке!
Автор: hellysmile
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/django-2/48933
Ссылки в тексте:
[1] проект на github: https://github.com/hellysmile/django-activeurl
[2] тут: https://github.com/hellysmile/django-activeurl#installation
[3] lxml: http://lxml.de/
[4] Выбор HTML элемента в котором искать ссылки: https://github.com/hellysmile/django-activeurl#parent_tag-divliself-default-li
[5] Выбор CSS стиля который будет добавлен: https://github.com/hellysmile/django-activeurl#css_class-string-default-active
[6] Поддержка меню: https://github.com/hellysmile/django-activeurl#menu-yesno-default-yes
[7] Поддержка: https://github.com/hellysmile/django-activeurl#jinja2
[8] Jinja2: http://jinja.pocoo.org/docs/
[9] Источник: http://habrahabr.ru/post/202842/
Нажмите здесь для печати.