почему же? Это делается. Есть даже несколько способов добавления пунктов в меню, на любой вкус.
Рекомендованный способ:
В каталоге приложения создаётся файл cms_toolbar.py, и в нём пишется нечто вроде такого:
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
from cms.toolbar_pool import toolbar_pool
from cms.toolbar_base import CMSToolbar
@toolbar_pool.register
class CatalogToolbar(CMSToolbar):
def populate(self):
if self.is_current_app:
menu = self.toolbar.get_or_create_menu('catalog', _('Catalog'))
menu.add_sideframe_item(_('Edit items'), url=reverse('admin:catalog_item_changelist'))
menu.add_sideframe_item(_('XML import from file'), url=reverse('admin:xml_import'))
menu.add_sideframe_item(_('1C import'), url=reverse('admin:soap_import'))
Естественно, в menu.add_sideframe_item (или menu.add_modal_item) можно отправлять не только reverse, а и любую логику. К примеру так:
def populate(self):
if self.is_current_app:
menu = self.toolbar.get_or_create_menu('catalog', _('Catalog'))
for section in Section.objects.all():
menu.add_sideframe_item(_('Edit %s') % section.name, url=reverse('admin:catalog_section_change', args=[section.pk]))
Можно же и прямо во вьюхах добавлять пункты в меню. Вот это прямо копипаста из реального проекта:
class CatalogDetailView(DetailView):
model = Item
template_name = "catalog/item.html"
context_object_name = 'item'
def dispatch(self, request, *args, **kwargs):
item = self.get_object()
request.toolbar.populate()
menu = request.toolbar.get_or_create_menu('catalog', _('Catalog'))
menu.add_modal_item(
_('Change %s') % item.name,
url=reverse('admin:catalog_item_change', args=[item.pk])
)
return super(CatalogDetailView, self).dispatch(request, *args, **kwargs)
Updated 7 Nov. 2014, 0:48 by N.E.M.