私はプロジェクトに取り組んでおり、既存の 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)
次の理由により、このアプローチを継続できるかどうかはわかりません。
特定のページの menu.namespace を取得する方法がわかりません
名前空間を「CMSMenu」にハードコーディングしても(どこかで読んだことがあります)、これは私が見ることができる何もしません。
では、アプリケーション モデル ベースのオブジェクトを子として既存のCMS ページ ベースのメニュー項目にどのようにアタッチすればよいのでしょうか?