【问题标题】:Django CMS - navigation orderDjango CMS - 导航顺序
【发布时间】:2012-08-06 02:07:16
【问题描述】:

我想将一个应用程序集成到 Django CMS。所以我关注了Django CMS的documentation

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

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 页面的菜单上,但我需要不同的顺序。

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

【问题讨论】:

    标签: python django django-cms


    【解决方案1】:

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

    我添加了一个名为 --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)
    

    【讨论】:

      【解决方案2】:

      感谢您帮助我,斯文! 我不知道修饰符的存在...

      以下是对您的代码的改进。 它将在任意位置插入应用程序节点。 每个应用程序节点都有一个 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)
      

      【讨论】:

      • 这与 Sven 的回答有何不同(您如何改进它?)
      猜你喜欢
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多