Django CMS中自定义菜单的顺序

时间:2018-10-26 08:26:31

标签: django django-cms

在我的Django应用中,我使用register_menu装饰器向Django CMSes菜单项添加了一些自定义菜单项:

@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条目之后,但似乎找不到有关如何执行此操作的任何文档。

我希望ID会以某种方式影响订购,但不会。有人建议按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中,我收集了自己的应用添加的所有条目,并将它们放在列表的末尾。

0 个答案:

没有答案