Заказ пользовательских меню в Django CMS - PullRequest
0 голосов
/ 26 октября 2018

В моем приложении Django я добавил несколько пользовательских пунктов меню в пункты меню Django CMSes, используя декоратор register_menu:

@menu_pool.register_menu
class MyMenu(Menu):
    def get_nodes(self, request):
        entries = []
        entries.append(NavigationNode('foo', '/bar', 1))
        ...
        return nodes

Эти пункты меню отображаются перед любыми меню CMS,т.е. список меню, возвращаемый из {% show_menu %}, сначала создает мои записи, затем записи, созданные в CMS.Я хотел бы, чтобы записи моих приложений появлялись после записей CMS, но я не могу найти никакой документации о том, как это сделать.

Я надеялся, что идентификатор как-то повлияет на порядок, но этоне делает.Кто-то предположил, что меню создаются в порядке, в котором приложения перечислены в INSTALLED_APPS, но перемещение моего приложения в самый низ также не изменило порядок.

Одно решение

КакВ комментариях предлагается, что Modifier может не только изменять атрибуты отдельных записей, но также может добавлять, удалять или переупорядочивать записи.

from menus.base import Menu, Modifier
from menus.menu_pool import menu_pool


@menu_pool.register_menu
class MyAppMenu(Menu):
    def get_nodes(self, request):
        nodes = []
        # ...
        return nodes


@menu_pool.register_modifier
class MyAppModifier(Modifier):
    def modify(self, request, nodes, namespace, root_id, post_cut, breadcrumb):
        if not post_cut:
            # ...
            # move our entries to the back of the list
            ours = []
            others = []
            for n in nodes:
                if n.namespace == 'MyAppMenu':
                    ours.append(n)
                else:
                    others.append(n)
            nodes = others + ours
        return nodes

Система меню использует имя класса, реализующего Menu в качестве атрибута namespace для пунктов меню.В Modifier я собираю все записи, добавленные моим собственным приложением, и помещаю их в конец списка.

...