В процессе создания сайта wanters.ru и этого сайта понадобилось привязать меню к содержимому страниц сайта. Для создания меню я использовал приложение treemenus, автор которого любезно описал его возможности и способы расширения.
Собственно процесс создания меню описывать я не буду, поскольку он довольно тривиален и подробно описан у автора в документации.
А вот особенности menu_extension и его настройки, связанные с контексто-ориентированностью и разграничением доступа постараюсь описать на примере своего сайта.
Итак, начнем.
1. Выполняем инструкции автора treemenus по установке приложения-расширения menu_extension, не делая пока syncdb (если не хотите потом править базу вручную или удалять таблицы для повторного создания).
2. Начинаем "обрабатывать напильником" под себя. Для этого вносим в код поправки.
models.py
...
usr = models.BooleanField(default=False)
# признак зарегистрированного пользователя
wrk = models.BooleanField(default=False)
# признак пользователя с доступом к рабочей информации
frnd = models.BooleanField(default=False)
# признак пользователя с привелегированным доступом
selected_patterns = models.TextField(blank=True)
# признак выбора текущего меню
menu_item.html
{% ifequal menu_type "Top_hor" %}
{% load menu_extension_filters %}
{% if user.is_authenticated %} {# Если авторизовался, то кто ты? #}
{% if perms.admin %} {# Если админ, то показываем все #}
<li>
<a href="{{ menu_item.url }}" class="{% if menu_item.extension.selected_patterns|match_path:request.path %}menu_now{% endif %}">
{# Меняем css класс меню для текущего контекста #}
{{ menu_item.caption }}
</a>
</li>
{% else %} {# Если не адми, то кто ты? #}
{% if perms.cont.frnd_view and menu_item.extension.frend %} {# Если привелегированый #}
<li>
<a href="{{ menu_item.url }}"
class="{% if menu_item.extension.selected_patterns|match_path:request.path %}menu_now{% endif %}">
{{ menu_item.caption }}
</a>
</li>
{% else %} {# Если не привелегированный, то кто ты? #}
{% if perms.cont.wrk_view and menu_item.extension.work %} {# Если по работе #}
<li>
<a href="{{ menu_item.url }}"
class="{% if menu_item.extension.selected_patterns|match_path:request.path %}menu_now{% endif %}">
{{ menu_item.caption }}
</a>
</li>
{% else %} {# Если не по работе, то ты зарегистрированный юзер #}
{% if menu_item.extension.public %}
<li>
<a href="{{ menu_item.url }}" class="{% if menu_item.extension.selected_patterns|match_path:request.path %}menu_now{% endif %}">
{{ menu_item.caption }}
</a>
</li>
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% else %} {# Если не авторизовался #}
{% if menu_item.extension.public %}
<li>
<a href="{{ menu_item.url }}" class="{% if menu_item.extension.selected_patterns|match_path:request.path %}menu_now{% endif %}">
{{ menu_item.caption }}
</a>
</li>
{% endif %}
{% endif %}
{% endifequal %}
Не забываем добавить в свой views.py или в models.pu (в зависимости от навыков :)) разграничение доступа к контенту.
3. И, наконец, последняя тонкость. При создании меню через админку, если вы хотите, чтобы головное меню воспринимало подчиненные меню как свою часть и отображало их, то Selected patterns необходимо оформлять примерно так:
^/$ # Главная страница сайта
^/world/
^/short/
^/funny/
^/tehno/
Примерно так выглядит Selected patterns для меню "Главная" на этом сайте.
Описаный мной способ подходит для двухуровневого меню. Что-то более сложное, на мой взгляд с помощью treemenus реализовывать не стоит. Легче написать своё.
Комментарии