我想将应用程序集成到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页面的菜单上,但我需要一个不同的订单。
有没有办法定义我的应用菜单显示在哪个位置?
答案 0 :(得分:3)
到目前为止,这是我的解决方法。 (我仍然希望有一种更干净的方式。)
我添加了名为--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)
答案 1 :(得分:0)
谢谢你帮助我,斯文! 我不知道修饰语的存在......
以下是您的代码的改进。 它将在任意位置插入应用程序节点。 每个app节点都有一个targetIndex属性,在菜单上给出了从零开始的位置编号。 对于驼峰式的情况很抱歉,但我使用了各种编程语言和一种风格来适应所有这些。 在示例中,app节点插入偶数位置号,'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)