3

私はプロジェクトに取り組んでおり、既存の CMS ベースのメニューに多数のアプリケーション モデル ベースのアイテムをプログラムで挿入できるようにする必要があります。ここにあるコードを使用してメニューを変更し始めました: http://docs.django-cms.org/en/2.3.3/extending_cms/app_integration.html

編集:より詳細

私のクライアントは、アプリケーション モデル オブジェクトを CMS メニューに追加して、それらがメニュー内の既存の CMS ページの子になるようにすることを望んでいます。私は現在、目的のメニュー項目の子であり、アプリケーションモデルオブジェクトと同じ名前を持つ CMS で偽のページを作成する必要がある完全なハックを行っています。次に、次のように Modifier をインストールしました。

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, ...)
  ...

menu.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#アタッチメニュー

また、これらの指示に従っているときに、誤ってCMSAttachMenuをcms.menu_basesからではなくmenus.baseからインポートしたため、エラーは発生しませんが、何も実行されないため、デバッグがかなり困難でした= /

将来誰かに役立つ場合に備えて、いくつかの実用的なコードを次に示します。

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)

これらの2つのファイルが配置されたら、サービスを再起動します。Django-CMSで、さまざまなSportsオブジェクトを子メニュー項目としてメニューに表示するメニュー項目のページに移動します。

[詳細設定]セクション(通常は折りたたまれています)に、新しいオプション[添付メニュー]が表示され、新しいアイテム[スポーツサブメニュー]を選択すると、ビジネスを開始できます。

于 2012-11-02T13:19:25.210 に答える