首页 > 解决方案 > 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,但是将我的应用程序移到最底部也不会改变顺序。

一种解决方案

正如评论中所建议的, aModifier不仅可以更改单个条目的属性,还可以添加、删除或重新排序条目。

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,我收集了我自己的应用程序添加的所有条目,并将它们放在列表的末尾。

标签: djangodjango-cms

解决方案


推荐阅读