Я новичок в Django CMS и изо всех сил стараюсь не спрашивать, но этот сводит меня с ума. Я сделал вики-приложение с моделью темы и категории. Я подключил его к сайту на своей CMS и добавил в свое меню. Теперь я хотел бы иметь возможность показывать все категории верхнего уровня, их дочерние категории и темы, их дочерние категории и т. д. в моем меню.
Menu/Navigation should look like this:
Wiki
Category1
Category1.1
Topic
Category1.2
Topic
Category2
Topic
Category3
...
Right now i can only show the Top categories:
Wiki
Category1
Category2
Category3
Я уже создал menu.py, чтобы получить пользовательское подменю в моей вики (тот, который вы видите выше):
menu.py
class WikiSubMenu(CMSAttachMenu):
name = _("Wiki Sub-Menu")
def get_nodes(self, request):
nodes = []
categories = Category.objects.filter(parent_id__isnull=True)
for c in categories:
node = NavigationNode(
mark_safe(c.name),
c.get_absolute_url(),
c.id,
)
nodes.append(node)
return nodes
menu_pool.register_menu(WikiSubMenu)
Моя модель категории:
class Category(models.Model):
''' Category model. '''
name = models.CharField(max_length=100)
slug = models.SlugField(unique=True)
description = models.TextField(blank=True)
parent = models.ForeignKey(
'self',
null=True,
blank=True,
related_name='children'
)
sort = models.IntegerField(default=0)
class Meta:
ordering = ['sort', 'name']
def __unicode__(self):
return self.name
@models.permalink
def get_absolute_url(self):
return ('topics:categories_category_detail', (), {'slug': self.slug})
def get_all_children(self):
return Category.objects.filter(parent=self)
Теперь можно ли создать Sub-SubMenu для всех категорий с дочерними элементами, их дочерними элементами, их дочерними элементами и так далее?
Спасибо за помощь и извините за плохой английский
-- ИЗМЕНИТЬ : --
Я только что обнаружил, что:
docs.django-cms.org/en/3.0.6/extending_cms/app_integration.html#integration-modifiers
(Удалена прямая ссылка, чтобы добавить 2 новые ссылки, извините за это)
Я думаю, это то, что я ищу, я был немного слеп, что не нашел. Я попробую и опубликую ответ, если это сработало.
-- ИЗМЕНИТЬ (ОПЯТЬ): --
У меня модификатор не сработал, но я получил целый кусок дальше, я прочитал Docs снова и обнаружил, что я могу дать NavigationNodes необязательный словарь attr, который я заполнил всеми категориями с parent=c, таким образом, у меня были данные, которые я нужно, то я обнаружил, что действительно хорошее выпадающее меню начальной загрузки, которое делает именно то, что я хотел. Итак, мой код до сих пор выглядит так:
menu.py
class TopicsSubMenu(CMSAttachMenu):
name = _("Wiki Sub-Menu")
def get_nodes(self, request):
nodes = []
categories = Category.objects.filter(parent_id__isnull=True)
for c in categories:
node = NavigationNode(
mark_safe(c.name),
c.get_absolute_url(),
c.pk,
attr=dict(
subcategories=Category.objects.filter(parent=c),),
)
nodes.append(node)
return nodes
И мой шаблон:
menu.html
{% for child in children %}
<li>
{% if child.children %}
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
{{ child.get_menu_title }}
<span class="caret">
</span>
</a>
<ul class="dropdown-menu multi-level" role="menu" aria-labelledby="dropdownMenu">
{% for child in child.children %}
{% if child.attr.subcategories.count %}
<li class="dropdown-submenu">
<a tabindex="-1" href="#">{{ child.get_menu_title }}</a>
<ul class="dropdown-menu">
{% for subcategory in child.attr.subcategories %}
<li>
<a tabindex="-1" href="{{ subcategory.get_absolute_url }}">{{ subcategory }}</a>
</li>
{% endfor %}
</ul>
</li>
{% else %}
<li><a href="{{child.get_absolute_url}}">{{ child.get_menu_title }}</li></a>
{% endif %}
{% endfor %}
</ul>
{% else %}
<a href="{{ child.get_absolute_url }}">
<span>
{{ child.get_menu_title }}
</span>
</a>
{% endif %}
</li>
{% if class and forloop.last and not forloop.parentloop %}
{% endif %}
{% endfor %}
Мой следующий шаг будет заключаться в том, чтобы написать все циклы «для» из шаблона в методе, сделать его рекурсивным с помощью цикла while или чего-то еще и опубликовать результат как ответ.
Надеюсь, я смогу помочь кому-нибудь с этим материалом :)