7. Расширение навигационного меню

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

Мы можем подключиться к системе меню django CMS, чтобы добавить наши собственные узлы в это навигационное меню.

7.1. Создайте навигационное меню

Мы создаем меню, используя подкласс CMSAttachMenu, и используем метод get_nodes() для добавления узлов.

Для этого нам нужен файл с именем cms_menus.py в нашем приложении. Добавьте cms_menus.py в polls_cms_integration/:

from django.urls import reverse
from django.utils.translation import gettext_lazy as _

from cms.menu_bases import CMSAttachMenu
from menus.base import NavigationNode
from menus.menu_pool import menu_pool

from polls.models import Poll


class PollsMenu(CMSAttachMenu):
    name = _("Polls Menu")  # give the menu a name this is required.

    def get_nodes(self, request):
        """
        This method is used to build the menu tree.
        """
        nodes = []
        for poll in Poll.objects.all():
            node = NavigationNode(
                title=poll.question,
                url=reverse('polls:detail', args=(poll.pk,)),
                id=poll.pk,  # unique id for this node within the menu
            )
            nodes.append(node)
        return nodes

menu_pool.register_menu(PollsMenu)

Что здесь происходит:

  • мы определяем класс PollsMenu и регистрируем его

  • присваиваем классу атрибут name (будет отображаться в админке)

  • в его методе get_nodes(), мы строим и возвращаем список узлов, где:

  • сначала мы получаем все объекты Poll

  • … и затем создать объект NavigationNode из каждого из них.

  • … и вернуть список этих NavigationNodes.

Этот класс меню не будет ничего делать, пока не будет прикреплен к странице. В Дополнительных настройках страницы, к которой вы ранее прикрепили apphook, выберите «Меню опросов» из списка Прикрепленное меню и сохраните еще раз. (Вы можете добавить меню на любую страницу, но логичнее всего добавить его на эту страницу).

select the 'Polls Menu'

Вы можете заставить меню автоматически добавляться на страницу с помощью apphook, если считаете это целесообразным. См. Добавление меню в apphooks для получения информации о том, как это сделать.

Примечание

Смысл здесь в том, чтобы проиллюстрировать основные принципы. В этом реальном случае обратите внимание на то, что:

  • Если вы собираетесь использовать вложенные страницы, вам нужно будет улучшить стиль меню, чтобы оно работало немного лучше.

  • Поскольку на странице «Опросы» все равно перечислены все опросы, это не самое практичное дополнение к меню.

Вернуться на верх