我正在做一个项目,我需要能够以编程方式将许多基于应用程序模型的项目注入现有的基于 CMS 的菜单中。我已经开始使用这里找到的代码来修改菜单:http ://docs.django-cms.org/en/2.3.3/extending_cms/app_integration.html 。
编辑:更多细节
我的客户希望我将应用程序模型对象附加到 CMS 菜单,以便它们是菜单中现有 CMS 页面的子级。我目前有一个彻底的黑客攻击,这需要我在 CMS 中制作作为所需菜单项的子项的假页面,与应用程序模型对象具有相同的名称,然后,我安装了一个修改器,如下所示:
class SportsMenuModifier(Modifier):
def modify(self, request, nodes, namespace, root_id, post_cut, breadcrumb):
if post_cut:
return nodes
for node in nodes:
if node.title == "Baseball":
node.url = "/sports/baseball"
elif node.title == "Football":
node.url = "/sports/Football"
elif node.title == "Bowling":
node.url = "/sports/bowling"
elif node.title == "Golf":
node.url = "/sports/golf"
return nodes
menu_pool.register_modifier(SportsMenuModifier)
这有很多错误,我不知道从哪里开始,但我将使用这个非详尽的列表来突出一些最基本的问题:
- 需要存在“假”CMS 页面
- 可笑地依赖于应用程序运动对象和假页面的命名
- 不会检测客户何时创建新的运动对象
- 让所有相关人员感到非常困惑
我希望我能做的是这样的事情(不会工作):
在模型.py
from django.db import models
from cms.models.pagemodel import Page
class Sport(models.Model):
name = models.CharField(...)
parent = modes.ForeignKey(Page, ...)
...
在菜单.py
class SportsMenu(Menu):
def get_nodes(self, request):
nodes = []
for sport in Sports.objects.filter(...).order_by('order'):
node = NavigationNode(
_(sport.name),
sport.get_absolute_url(),
sport.pk,
sport.parent.pk
)
nodes.append(node)
return nodes
menu_pool.register_menu(SportsMenu)
我不确定我是否可以继续使用这种方法,因为:
我不知道如何获取给定页面的 menu.namespace
即使我将命名空间硬编码为“CMSMenu”(我在某处读到这就是它的样子),这仍然没有做任何我能看到的事情。
那么,我们如何将基于应用程序模型的对象作为子对象附加到现有的基于 CMS 页面的菜单项上呢?