django меню для сайта

Уроки по Django

Уроки по python-фреймворку Django. В уроках по шагам раскрываются важные аспекты данного фреймворка, освещаются ошибки и сложности, с которыми может столкнуться Django разработчик.

Страницы

среда, 10 июля 2013 г.

Создание меню сайта в Django

django меню для сайта. Смотреть фото django меню для сайта. Смотреть картинку django меню для сайта. Картинка про django меню для сайта. Фото django меню для сайта

Нам нужно, чтобы владелец сайта мог сам редактировать пункты меню через админку Django. Для этого мы используем стороннее приложение django-menu.

Так будет выглядеть интерфейс этого приложения в админке после подключения:

django меню для сайта. Смотреть фото django меню для сайта. Смотреть картинку django меню для сайта. Картинка про django меню для сайта. Фото django меню для сайта

Установка приложения django-menu:

1. Скачать с github архив django-menu.

2. Скопировать из скачанного архива папку menu в свой проект.

3. В настройках вашего проекта settings.py:

3.1. подключить это приложение:

3.2. добавить контекстный процессор django.core.context_processors.request :

4. Создать таблицы для данного приложения, выполнив команду:
manage.py syncdb
или
manage.py migrate menu (если вы используете south)

6. В шаблоне (к примеру, base.html) использовать данное приложение:

Как видно, данное приложение может определять текущий пункт меню, что позволяет нам выделять его назначением определенного класса css (в нашем примере это класс «active»).

Источник

Одна из возможных реализаций бокового меню для Django

Привет. Не давно была задача реализовать боковое меню со списком каталогов; что бы его можно было вставить в любое место и в любую страницу!
Проблема заключалась в том что список большой и для того что бы он не нагружал сервак я его закэшировал, но тут не буду указывать как закэшировал так как писать придется долго.
В общем буду описывать все по порядку!

Начнем с создания шаблонного тега! для того что бы его реализовать! я создал папку пакета:

django меню для сайта. Смотреть фото django меню для сайта. Смотреть картинку django меню для сайта. Картинка про django меню для сайта. Фото django меню для сайта

назвать его можно как хотите но я его назвал его: context_processors
далее создал файл : right_menu.py
в котором будет реализована вся логика шаблонного тега.

далее в settings.py подключаем шаблонный тег

в самом шаблоне right_menu.html

django меню для сайта. Смотреть фото django меню для сайта. Смотреть картинку django меню для сайта. Картинка про django меню для сайта. Фото django меню для сайта

Рекомендуем хостинг TIMEWEB

Подписчики

django меню для сайта. Смотреть фото django меню для сайта. Смотреть картинку django меню для сайта. Картинка про django меню для сайта. Фото django меню для сайта

Я добавил разделитель контента в статье, чтобы скрыть под катом основной содержание статьи. Спасибо за материал.

django меню для сайта. Смотреть фото django меню для сайта. Смотреть картинку django меню для сайта. Картинка про django меню для сайта. Фото django меню для сайта

так ты там тоже используешь теги! только симпл упращенный тег! только в твоем случает ты не подгружаешь шаблон! а так суть одна! но в моем случае я просто вывожу через инклуде ) он хорош для менюшек! Я так считаю ))

django меню для сайта. Смотреть фото django меню для сайта. Смотреть картинку django меню для сайта. Картинка про django меню для сайта. Фото django меню для сайта

Согласен, что для менюшек хороши, я много чего на них сделал уже

Кстати, самого примере применения get_right_school_menu нет.

Как именно он выглядит в шаблоне?

inclusion tag делается точно так же в templatetags, вот например

применение в шаблоне будет таким

Просто у меня на сайте сейчас используется более 35-ти inclusion_tag, я бы свихнулся каждый прописывать в context_processros. Да и минус такого подхода в том, что каждый запрос обрабатывается всеми middleware вне зависимости, используется он или нет. То есть всё равно будет искаться тот метод, который ты используешь в шаблонах, даже если он не был там задействован. То есть, если тег не используется, то middleware работает вхолостую, тогда как templatetags будет подгружаться тогда, когда он действительно нужен.

django меню для сайта. Смотреть фото django меню для сайта. Смотреть картинку django меню для сайта. Картинка про django меню для сайта. Фото django меню для сайта

просто инклудишь шаблон где тебе он нужен и все!

django меню для сайта. Смотреть фото django меню для сайта. Смотреть картинку django меню для сайта. Картинка про django меню для сайта. Фото django меню для сайта

Понятно, тогда это статья не о применении тега, а о написании context processor.

Видишь ли, тег include работает независимо от того, напишешь ли ты это

Тег include не смотрит на то, зарегистрирован ли шаблон в качестве имени или нет. И каждый раз при его вызове он ищет в каталогах данный шаблон.
То есть, если ты удалишь эти две строки, то ровным счётом ничего не изменится.

А context proccessor я понимаю почему там написан, как раз, чтобы генерить все эти категории вне зависимости от страницы, на которой находится пользователь. Но реально, отвечаю, те две строки лишние и работают вхолостую, их можно удалить и ровным счётом ничего не изменится.

django меню для сайта. Смотреть фото django меню для сайта. Смотреть картинку django меню для сайта. Картинка про django меню для сайта. Фото django меню для сайта

то есть ты предлагаешь рендерить на прямую?

django меню для сайта. Смотреть фото django меню для сайта. Смотреть картинку django меню для сайта. Картинка про django меню для сайта. Фото django меню для сайта

django меню для сайта. Смотреть фото django меню для сайта. Смотреть картинку django меню для сайта. Картинка про django меню для сайта. Фото django меню для сайта

то есть структура app будет такая

А далее добавляешь в файл с названием приложения свой inclusion_tag следующим образом

А потом в шаблоне вызываешь

Твой context processor добавит в контекст всё необходимое, а настройка takes_context=True позволит тегу его захватить.

Преимущество в данном случае будет в том, что шаблон будет реально закеширован и django не будет искать его при каждом рендеринге

Источник

Как настроить меню навигации¶

В этом документе мы обсуждаем три различных способа настройки навигационных меню сайтов django CMS.

Меню : статическое расширение пунктов меню

Прикрепить меню : Прикрепите свое меню к странице.

Модификаторы навигации : Изменение всего дерева меню

Создайте cms_menus.py в вашем приложении, со следующим:

Текст для узла меню

URL для ссылки на узел меню

Уникальный идентификатор для этого меню

Если это дочерний узел другого узла, укажите здесь идентификатор родителя.

Словарь дополнительных атрибутов, которые вы можете использовать в модификаторе или в шаблоне

Должен ли этот пункт меню быть видимым или нет

Настройка меню во время выполнения¶

Чтобы адаптировать меню в зависимости от условий запроса (скажем: анонимный/залогиненный пользователь), вы можете использовать Navigation Modifiers или воспользоваться существующими.

Например, можно добавить атрибуты <'visible_for_anonymous': False>/ <'visible_for_authenticated': False>, распознаваемые модификатором AuthVisibility ядра django CMS.

Прикрепить меню¶

Вместо расширения от Menu вам нужно расширяться от cms.menu_bases.CMSAttachMenu и вам нужно определить имя.

Мы сделаем это на примере, приведенном выше:

Теперь вы можете связать это меню со страницей на вкладке Дополнительно в настройках страницы под прикрепленным меню.

Модификаторы навигации¶

Модификаторы навигации предоставляют вашему приложению доступ к меню навигации.

Модификатор может изменять свойства существующих узлов или перестраивать целые меню.

Примеры использования¶

Простой пример: у вас есть новостное приложение, которое публикует страницы независимо от django CMS. Однако вы хотели бы интегрировать это приложение в структуру меню вашего сайта, чтобы в соответствующих местах в навигационном меню появлялся узел News.

В другом примере, вы можете захотеть, чтобы определенный атрибут вашего Pages был доступен в шаблонах меню. Для того чтобы узлы меню были легкими (что может быть важно для сайта с тысячами страниц), они содержат только минимальные атрибуты, необходимые для создания удобного меню.

Как это работает¶

Поместите ваши модификаторы в cms_menus.py вашего приложения.

Теперь, когда загружается страница и генерируется меню, ваш модификатор сможет осматривать и изменять его узлы.

Вот пример простого модификатора, который помещает атрибут changed_by каждой страницы в соответствующий атрибут NavigationNode :

Экземпляр запроса Django. Вы хотите модифицировать на основе сессий, пользователя или разрешений?

Все узлы. Обычно вы хотите вернуть их снова.

Пространство имен меню. Дается только в том случае, если кто-то запросил меню, содержащее только узлы из этого пространства имен.

Был ли запрос меню основан на удостоверении личности?

Это вызов хлебных крошек, а не вызов меню?

Вот пример встроенного модификатора, который отмечает все уровни узла:

Проблемы с производительностью в модификаторах меню¶

Навигационные модификаторы могут быстро стать узким местом в производительности. Каждый модификатор вызывается несколько раз: Для хлебной крошки ( breadcrumb=True ), для всего дерева меню ( post_cut=False ), для дерева меню, урезанного до видимой части ( post_cut=True ) и, возможно, для каждого уровня навигации. Выполнение неэффективных операций внутри модификатора навигации может привести к большим проблемам с производительностью. Некоторые советы по поддержанию быстродействия реализации модификатора:

Укажите, когда именно необходим модификатор (в хлебной крошке, до или после разреза).

Рассматривайте только узлы и страницы, имеющие отношение к модификации.

Выполняйте как можно меньше запросов к базе данных (т.е. не в цикле).

В запросах к базе данных получайте именно те атрибуты, которые вас интересуют.

Если вам предстоит выполнить несколько модификаций, старайтесь применять их одним и тем же методом.

Источник

Меню и навигация¶

Существует четыре тега шаблонов для использования в шаблонах, которые связаны с меню:

Чтобы использовать любой из этих тегов шаблона, вам необходимо иметь <% load menu_tags %>в вашем шаблоне перед строкой, на которой вы вызываете тег шаблона.

show_menu¶

Первые два параметра, start_level (по умолчанию=0) и end_level (по умолчанию=100), определяют, с какого уровня должна отображаться навигация и на каком уровне она должна остановиться. Если у вас корневым узлом является home (т.е. уровень 0) и вы не хотите отображать корневой узел (узлы), установите start_level в 1.

Третий параметр, extra_inactive (по умолчанию=0), определяет, сколько уровней навигации должно отображаться, если узел не является прямым предком или потомком текущего активного узла.

Четвертый параметр, extra_active (по умолчанию=100), определяет, сколько уровней потомков активного узла должно быть отображено.

Шестой параметр root_id задает идентификатор корневого узла.

Некоторые примеры¶

Полная навигация (в виде вложенного списка):

Навигация с активным деревом (в виде вложенного списка):

Навигация только с одним активным дополнительным уровнем:

Уровень 1 навигации (в виде вложенного списка):

Навигация с помощью пользовательского шаблона:

show_menu_below_id¶

Если вы задали id в расширенных настройках страницы, вы можете отобразить подменю этой страницы с помощью тега шаблона. Например, у нас есть страница под названием meta, которая не отображается в навигации и имеет id «meta»:

Вы можете задать ему те же необязательные параметры, что и show_menu :

показать_под_меню¶

Отображает подменю текущей страницы (в виде вложенного списка).

Первый аргумент, levels ( default=100 ), определяет, на сколько уровней вглубь должно быть отображено подменю.

Второй аргумент, root_level ( default=None ), указывает, на каком уровне, если таковой имеется, меню должно иметь свой корень. Например, если root_level равен 0, то меню будет начинаться с этого уровня, независимо от того, на каком уровне находится текущая страница.

Третий аргумент, nephews ( default=100 ), определяет, сколько уровней племянников (детей братьев и сестер) будет показано.

Источник

Django меню для сайта

Simple Django website navigation system

Latest commit

Git stats

Files

Failed to load latest commit information.

README.rst

BSD-licensed menu tools for Django, built by Ross Poulton

django-menu provides a basic structure for you to build multiple navigation menus for your website, such as the header menubar. These menus can be easily maintained by staff using the Django administration without any knowledge of HTML or Django internals.

Sub-menus can also be easily built and displayed only for particular URIs.

pip install django-menu

Add menu to your INSTALLED_APPS

Add django.template.context_processors.request to your TEMPLATE settings. Below is a reasonably safe TEMPLATES setting for most small projects, however yours may vary.:

Add a Menu (eg called headernavigation ) and add some items to that menu

In your template, load the menu tags and embed your primary menu.

In your template, instead of the <% menu %>tag use <% submenu %>. If a submenu for the current URI exists, it will be shown. The << submenu_items >> list contains your navigation items, ready to output like in the examples above.

To enable caching to continue to let you make items available to anonymous or authenticated users, and to enable the «Current Page» functionality, the cache will contain one dataset for each menu, authentication & path combination.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *