Django CMS - 导航顺序



我想将一个应用程序集成到Django CMS中。因此,我遵循了Django CMS的文档。

例如:我在 menu.py 应用程序中使用以下代码(来自文档)。

from menus.base import Menu, NavigationNode
from menus.menu_pool import menu_pool
from django.utils.translation import ugettext_lazy as _
class TestMenu(Menu):
    def get_nodes(self, request):
        nodes = []
        n = NavigationNode(_('sample root page'), "/", 1)
        n2 = NavigationNode(_('sample settings page'), "/bye/", 2)
        n3 = NavigationNode(_('sample account page'), "/hello/", 3)
        n4 = NavigationNode(_('sample my profile page'), "/hello/world/", 4, 3)
        nodes.append(n)
        nodes.append(n2)
        nodes.append(n3)
        nodes.append(n4)
        return nodes
menu_pool.register_menu(TestMenu)

我的问题是节点的顺序。使用此代码,我的菜单将附加到我的cms页面的菜单上,但我需要不同的顺序。

有没有办法定义我的应用程序菜单出现在哪个位置?

到目前为止,这是我的解决方法。(我仍然更喜欢更干净的方式。

我添加了一个名为 --appname-- 的 CMS 页面,这是我menu.py

from menus.base import Menu, NavigationNode
from menus.base import Modifier
from menus.menu_pool import menu_pool
my_items = ["a", "b", "c"]
class ImmoMenu(Menu):
    def get_nodes(self, request):
        nodes = []
        i = 0
        for name in my_items:
            i += 1
            n = NavigationNode(name, "/", i, attr={'appname': True})
            nodes.append(n)
        return nodes
menu_pool.register_menu(ImmoMenu)

class ImmoModifier(Modifier):
    def modify(self, request, nodes, namespace, root_id, post_cut, breadcrumb):
        if post_cut is not True:
            return nodes
        split_passed = False
        nodes_before = []
        nodes_after = []
        nodes_immo = []
        for node in nodes:
            if node.title == "--appname--":
                split_passed = True
                continue
            if 'appname' in node.attr:
                nodes_immo.append(node)
            elif split_passed:
                nodes_after.append(node)
            else:
                nodes_before.append(node)
        return nodes_before + nodes_immo + nodes_after
menu_pool.register_modifier(ImmoModifier)

谢谢你帮助我,斯文!!我不知道修改器的存在...

下面是对代码的改进。它将在任意位置插入应用节点。每个应用节点都有一个 targetIndex 属性,在菜单上为其提供从零开始的位置编号。很抱歉骆驼案,但我使用混合的编程语言和一种风格来适应它们。在示例中,应用程序节点插入到偶数位,"follow"是我的应用程序的名称。

    from menus.base import Menu, NavigationNode, Modifier
    from menus.menu_pool import menu_pool
    class FollowMenu (Menu):
        def get_nodes (self, request):
            nodes = []
            for i in range (5):
                nodes.append (NavigationNode (('Test' + str (i)), '/', i,  attr={'targetIndex': 2 * i}))
            return nodes
    menu_pool.register_menu (FollowMenu)
    class FollowModifier (Modifier):
        def modify (self, request, nodes, namespace, root_id, post_cut, breadcrumb):
            if not post_cut:
                return nodes
            appNodes = [node for node in nodes if 'targetIndex' in node.attr]
            cmsNodes = [node for node in nodes if not 'targetIndex' in node.attr]
            resultNodes = []
            appNodeIndex = 0
            cmsNodeIndex = 0
            for resultNodeIndex in range (len (nodes)):
                if appNodeIndex < len (appNodes) and appNodes [appNodeIndex] .attr ['targetIndex'] == resultNodeIndex:
                    resultNodes.append (appNodes [appNodeIndex])
                    appNodeIndex += 1
                elif cmsNodeIndex < len (cmsNodes):
                    resultNodes.append (cmsNodes [cmsNodeIndex])
                    cmsNodeIndex += 1
                else:
                    raise Exception ('Error merging app menu and cms menu items')
            return resultNodes
    menu_pool.register_modifier (FollowModifier)

最新更新