gpt4 book ai didi

django - 在现有菜单中插入新的子菜单项

转载 作者:行者123 更新时间:2023-12-02 01:16:27 25 4
gpt4 key购买 nike

我正在开发一个项目,我需要能够以编程方式将许多基于应用程序模型的项目注入(inject)到现有的基于 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 页面
  • 可笑地依赖于应用程序体育对象和虚假页面的命名
  • 威尔不检测客户何时创建新的运动物体
  • 让所有相关人员都感到非常困惑

我希望我能做的是这样的事情(不会工作):

在 models.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)

我不确定我是否可以继续采用这种方法,因为:

  1. 我不知道如何获取给定页面的menu.namespace

  2. 即使我将命名空间硬编码为“CMSMenu”(我在某处读到这就是它的含义),这仍然没有执行任何我可以看到的操作。

那么,我们如何将基于应用程序模型的对象作为子项附加到现有基于 CMS 页面的菜单项?

最佳答案

这个问题的答案是我应该一直使用(并且AM使用)附加菜单,不幸的是,这里的记录非常少:https://django-cms.readthedocs.org/en/latest/extending_cms/app_integration.html#attach-menus .

另外,当我按照这些说明操作时,我不小心从menus.base而不是从cms.menu_bases导入了CMSAttachMenu,这不会导致任何错误,但也不会执行任何操作,因此,这是相当困难的调试=/

这里是一些工作代码,以防将来对任何人有帮助:

在 models.py 中

from django.db import models

class Sport(models.Model):
name = models.CharField(max_length=64, blank=True)
slug = models.SlugField(blank=True)

def __unicode__(self):
return self.name

def get_absolute_url(self):
return "/sports/" + self.slug

在menu.py中

from cms.menu_bases import CMSAttachMenu
from django.utils.translation import ugettext_lazy as _
from menus.base import NavigationNode
from menus.menu_pool import menu_pool

from apps.theproject.models import Sport


class SportSubMenu(CMSAttachMenu):

name = _("Sports Sub-Menu")

def get_nodes(self, request):

nodes = []
for sport in Sport.objects.order_by('order'):
node = NavigationNode(
sport.name,
sport.get_absolute_url(),
sport.pk
)
nodes.append(node)

return nodes

menu_pool.register_menu(SportSubMenu)

这两个文件就位后,重新启动服务。在 Django-CMS 中,导航到您希望其菜单项的各种 Sports 对象在菜单中显示为子菜单项的页面。

在“高级设置”部分(通常处于折叠状态)中,您将看到一个新选项“附加菜单”,选择新项目“体育子菜单”即可开始工作。

关于django - 在现有菜单中插入新的子菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13022262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com