3

我正在做一个项目,我需要能够以编程方式将许多基于应用程序模型的项目注入现有的基于 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)

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

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

  2. 即使我将命名空间硬编码为“CMSMenu”(我在某处读到这就是它的样子),这仍然没有做任何我能看到的事情。

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

4

1 回答 1

6

对此的答案是我应该一直在使用(和 AM 使用)附加菜单,不幸的是,这里的记录非常差:https ://django-cms.readthedocs.org/en/latest/extending_cms/app_integration.html#附加菜单

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

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

在模型.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

在菜单.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 对象在菜单中显示为子菜单项的菜单项的页面。

在“高级设置”部分(通常是折叠的)中,您会看到一个新选项“附加菜单”,选择新项目“运动子菜单”,您就可以开始营业了。

于 2012-11-02T13:19:25.210 回答