也许我只是瞎了,但我找不到能帮助我解决这个问题的任何事情。我有一个Django项目,我正在使用Django CMS,例如在所有网站上显示菜单。现在我想添加一个额外的Django子应用程序,它应该显示一个完全不同的菜单。有没有首选的方法呢?
现在我到了以下解决方案。我正在使用两个cms_menus.py
文件,一个用于定义用于所有迄今为止网站的NavigationNodes
,另一个用于定义新子应用的NavigationNodes
。因此每个NavigationNode
都有一个命名空间(开箱即用),它基本上表示应该显示的位置。我得到一个Modifier
,如果设置了NavigationNodes
,则删除所有具有不同命名空间的class NamespaceModifier(Modifier):
def modify(self, request, nodes, namespace, root_id, post_cut, breadcrumb):
if post_cut:
return nodes
if namespace is not None:
# only return nodes from given namespace
return [node for node in nodes if node.namespace == namespace]
return nodes
menu_pool.register_modifier(NamespaceModifier)
:
show_menu
这样做的动机是,namespace
模板标记接受namespace
参数,docs中指定:“第五个参数{% show_menu 0 100 100 100 "website/nav.html" "TestMenu" %}
指定命名空间菜单。如果[sic] empty将使用所有名称空间。“ (虽然应该注意它需要在模板名称之后添加,例如TestMenu
,其中Modifier
是命名空间。)
自定义show_menu
是必要的,因为namespace
除了设置NavigationNodes
之外似乎没有对namespace
做任何事情。我有点期待开箱即用只显示给定attr
的{{1}},但显然我错了......
是否有更好的解决方案(我认为很常见)要求使用不同的菜单?显然,在上面的解决方案中,如果无法将NavigationNodes
映射到Node-namespace,我也可以使用$
。{/ p>