sortarage
@sortarage
Я тучка-тучка-тучка, я вовсе не медведь

Как настроить навигацию в Django через url.patterns?

Добрый вечер.
Учу Python, делаю тестовый проект.

Задача: сделать так, чтобы class="active" для <li> присваивался исходя из адреса страницы. Реализовываю через django.core.context_processors.request, чтобы вытягивать адрес из path.

Вот как выглядит сейчас:

<li role="presentation" {% if request.path == '/' %}class="active"{% endif %}><a href="{% url 'home' %}">Главная</a></li>
<li role="presentation" {% if '/groups' in request.path %}class="active"{% endif %}><a href="{% url 'groups' %}">Группы</a></li>


То есть, если корень - то активен первый li, а если ссылка содержит "/groups", то второй. Этот вариант работает, но категорически не гибок. Я хочу проверять ссылку через настроенные url.patterns в urls.py:

url(r'^$', 'students.views.students_list', name='home'),
url(r'^groups/$', 'students.views.groups_list', name='groups')


Вопрос: как это сделать? Я не могу просто подставить {% url 'groups' %} в if-условие, ибо синтаксис нарушается, а правильный синтакс я не знаю. Буду благодарен любому совету :)
  • Вопрос задан
  • 578 просмотров
Решения вопроса 1
sim3x
@sim3x
Есть три уровня для решения такого рода задач
0. Модель. в методе делаешь всю кухню - результат в виде дикта. Минус в том, что не всегда удобно request получать
1. Вью, тоже самое, только request получать удобно
2. Темплейт, пишется темплейт таг и внутри него происходит магия

В тестовом, тебе лучше сделать все во вью в отдельной функции
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@IvanOne
Если меню простое без заморочек и в нем не так много элементов то я обычно резервирую для каждого элемента блок и потом в нужном шаблоне просто в этом блоке пишу класс, не много грязная реализация но простая, например:
<li class="{% block home %}{% endblock %} treeview">
           <a href="/">
                <i class="fa fa-rocket"></i>
                  <span>Главная</span>
            </a>
 </li>

Это в базовом шаблоне, а в дочернем:
{% block home %}active{% endblock %}
Есть и готовые решения https://github.com/rossp/django-menu
ну и на закуску статейка habrahabr.ru/post/202842

ps еще можно реализовать во фронтенде путем js или jquery, многие разработчики считают что эта задача больше относится именно к фронтенд, и должна решаться на стороне клиента.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы