django-cms内にカスタムアプリがあり、アプリにサブメニューを添付する必要があります。私はこれを行うために見つけたガイドと例に従い(ここでブランドンによって与えられたポートフォリオの例を参照してください:Djangocms内のカスタムビュー?)、サブメニューを起動して実行することができました。
上記の例を拡張することにより、このポートフォリオアプリがここに表示され、少数の異なるビュー(作成ビュー、詳細ビュー、およびおそらく他のいくつかの関連ビュー)で構成されている場合はどうなりますか。この小さなアプリでユーザーナビゲーションに関連する選択肢を保持するサブメニューを作成する必要がある場合はどうなりますか。また、ナビゲーションがビューで選択されたコンテンツに基づいて選択肢を表示する必要がある場合はどうなりますか(ポートフォリオが選択されているか類似している場合にのみ「編集」)。サブメニューは、どのポートフォリオが選択されたかを知る必要がありますよね?または、少なくともポートフォリオが実際に選択されて表示されていること。
ビューがすでに知っていることをCMSAttachMenuの実装に転送するにはどうすればよいですか?私の場合、交流会や「イベント」を扱うアプリを実装しています。以下の例は、Eventオブジェクトが明らかにリクエストに登録されていないため機能しませんが、私が望むものを示しています。
# menu.py
from django.core.urlresolvers import reverse
from menus.base import NavigationNode
from menus.menu_pool import menu_pool
from cms.menu_bases import CMSAttachMenu
from App.apps.event.models import Event
from django.utils.translation import ugettext_lazy as _
import logging
logger = logging.getLogger('instant.event')
class EventMenu(CMSAttachMenu):
name = _("Event Sub-Menu")
def get_nodes(self, request):
nodes = []
nodes.append(NavigationNode(_('Create new events'), reverse("admin:event_event_add"), 1 + len(nodes), 0))
if hasattr(request, 'event'):
if request.event.is_registered_to_event(request.user):
nodes.append(NavigationNode(_('Unregister from this event'), reverse("unregister_from_event"), 1 + len(nodes), 0))
else:
nodes.append(NavigationNode(_('Register to participate in this event'), reverse("unregister_from_event"), 1 + len(nodes), 0))
if request.user.is_superuser():
nodes.append(NavigationNode(_('Register other participant to this event'), reverse("register_admin", args=(request.event.id)), 1 + len(nodes), 0))
nodes.append(NavigationNode(_('Back to list of events'), reverse("events"), 1 + len(nodes), 0))
return nodes
menu_pool.register_menu(EventMenu)