В моем приложении Django я добавил несколько пользовательских пунктов меню в пункты меню Django CMSes, используя декоратор register_menu
:
@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, но я не могу найти никакой документации о том, как это сделать.
Я надеялся, что идентификатор как-то повлияет на порядок, но этоне делает.Кто-то предположил, что меню создаются в порядке, в котором приложения перечислены в INSTALLED_APPS
, но перемещение моего приложения в самый низ также не изменило порядок.
Одно решение
КакВ комментариях предлагается, что Modifier
может не только изменять атрибуты отдельных записей, но также может добавлять, удалять или переупорядочивать записи.
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
я собираю все записи, добавленные моим собственным приложением, и помещаю их в конец списка.