Django CMS多层下拉菜单

苜蓿

我是Django CMS的新手,我正竭尽所能避免发问,但这使我发疯。我制作了一个带有主题和类别模型的Wiki应用程序。我将其挂接到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来在我的Wiki上获得一个Custom SubMenu(您在上面看到的一个):

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个新链接,对此表示抱歉)

我认为这是我正在寻找的东西,我有点盲目未找到。我会尝试一下,如果可以解决,请发布答案。

-编辑(再次):-

修改器对我不起作用,但我又做了整整一遍,再次阅读了文档,发现可以给NavigationNodes一个可选的attr字典,这样我就可以用parent = c填充所有类别我有了所需的数据,然后我发现了真正不错的bootstrap下拉菜单,它确实可以满足我的需求。所以到目前为止,我的代码如下所示:

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 %}

我的下一步将是从模板中的方法中编写整个“ for”循环,并使用while循环或类似内容使其递归,并将结果发布为Answer。

我希望我可以帮助某人:)

苜蓿

WOHO!我终于做到了!

base.html

<div class="navbar-collapse collapse">
    <ul class="nav navbar-nav">
        {% show_menu 0 100 100 100 "menu.html" %}
    </ul>
</div>

menu.html:

{% for child in children %}
    <li class="child{% if child.selected %} selected{% endif %}{% if child.ancestor %} ancestor{% endif %}{% if child.sibling %} sibling{% endif %}{% if child.descendant %} descendant{% endif %}{% if child.children %} dropdown{% endif %}">

        <a {% if child.children %}class="dropdown-toggle" data-toggle="dropdown"{% endif %} href="{{ child.attr.redirect_url|default:child.get_absolute_url }}">
            <span>{{ child.get_menu_title }}</span>{% if child.children|length %}<span class="caret"></span>{% endif %}
        </a>

        {% if child.children %}
            <ul class="dropdown-menu multi-level" role="menu" aria-labelledby="dropdownMenu">
                {% show_menu from_level to_level extra_inactive extra_active "dropdownmenu.html" "" "" child %}
            </ul>
        {% endif %}

    </li>
    {% if class and forloop.last and not forloop.parentloop %}{% endif %}

{% endfor %}

和我的dropdownmenu.html :(递归的内容从这里开始)

{% load i18n menu_tags cache mptt_tags %}
{% for child in children %}
    <li {% if child.children %}class="dropdown-submenu"{% else %} {% endif %}>
        <a tabindex="-1" href="{{ child.attr.redirect_url|default:child.get_absolute_url }}">{{ child.get_menu_title }}</a>
        {% if child.children %}
            <ul class="dropdown-menu">
                {% show_menu from_level to_level extra_inactive extra_active "dropdownmenu.html" "" "" child %}
            </ul>
        {% endif %}

    </li>
{% endfor %}

最重要的是menu.py:

class TopicsSubMenu(CMSAttachMenu):
    name = _("Wiki Sub-Menu")

    def get_nodes(self, request):
        nodes = []
        categories = Category.objects.all()

        for c in categories:
            node = NavigationNode(
                mark_safe(c.name),
                c.get_absolute_url(),
                c.pk
            )
            if c.parent:
                node.parent_id = c.parent_id
            nodes.append(node)

        topics = Topic.objects.all().exclude(category__isnull=True)
        for t in topics:
            node = NavigationNode(
                mark_safe(t.title),
                t.get_absolute_url(),
                t.pk,
                t.category.all()[0].id,
                parent_namespace="TopicsSubMenu"
            )
            nodes.append(node)
        return nodes

menu_pool.register_menu(TopicsSubMenu)

就是这样!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django选择下拉菜单流

来自分类Dev

Django 下拉菜单对 admin 的依赖

来自分类Dev

安装了Django-cms,但下拉菜单和其他JS不起作用-修复思路?

来自分类Dev

Django admin中下拉菜单的默认设置

来自分类Dev

在Django模型中创建动态下拉菜单

来自分类Dev

Django-根据下拉菜单更改发送表单的路径

来自分类Dev

如何在Django中动态更改下拉菜单

来自分类Dev

如何在Django中处理可靠的下拉菜单

来自分类Dev

如何更改Django表单中下拉菜单的标签?

来自分类Dev

下拉菜单未与Django一起显示

来自分类Dev

如何翻译下拉菜单django-filter

来自分类Dev

将多层下拉菜单从点击变为悬停

来自分类Dev

Django-根据下拉菜单中的选择将用户重定向到页面

来自分类Dev

Django admin,使用弹出窗口中的选择覆盖下拉菜单

来自分类Dev

在Django中使用硬编码选项对下拉菜单进行排序

来自分类Dev

将jQuery添加到Django管理页面以选择下拉菜单以启用/禁用它

来自分类Dev

Django 3.x-自定义下拉菜单的自定义默认值

来自分类Dev

Django Blog-评论功能以表格形式显示作者的下拉菜单

来自分类Dev

(Django)更改外键下拉菜单后,如何使“ selected”选项有效?

来自分类Dev

页面重新加载后Django保持下拉菜单选择的语言

来自分类Dev

选择一个有效的选项Django Filtered下拉菜单

来自分类Dev

jQuery克隆的django可选的自动完成下拉菜单不起作用

来自分类Dev

Django admin,使用弹出窗口中的选择覆盖下拉菜单

来自分类Dev

Django-如何根据数据时间字段限制下拉菜单中的外键选择

来自分类Dev

django:在提交下拉菜单时更新数据库

来自分类Dev

在Django Admin的Add/Change页面的下拉菜单中选择相关的外键值

来自分类Dev

使用 Django,下拉菜单的选定选项不会传递到服务器

来自分类Dev

如何基于模型中的外键字段在django中开发下拉菜单

来自分类Dev

Django:在 HTML 中使用多个输入字段(带下拉菜单)搜索 Django 模型的多个字段

Related 相关文章

  1. 1

    Django选择下拉菜单流

  2. 2

    Django 下拉菜单对 admin 的依赖

  3. 3

    安装了Django-cms,但下拉菜单和其他JS不起作用-修复思路?

  4. 4

    Django admin中下拉菜单的默认设置

  5. 5

    在Django模型中创建动态下拉菜单

  6. 6

    Django-根据下拉菜单更改发送表单的路径

  7. 7

    如何在Django中动态更改下拉菜单

  8. 8

    如何在Django中处理可靠的下拉菜单

  9. 9

    如何更改Django表单中下拉菜单的标签?

  10. 10

    下拉菜单未与Django一起显示

  11. 11

    如何翻译下拉菜单django-filter

  12. 12

    将多层下拉菜单从点击变为悬停

  13. 13

    Django-根据下拉菜单中的选择将用户重定向到页面

  14. 14

    Django admin,使用弹出窗口中的选择覆盖下拉菜单

  15. 15

    在Django中使用硬编码选项对下拉菜单进行排序

  16. 16

    将jQuery添加到Django管理页面以选择下拉菜单以启用/禁用它

  17. 17

    Django 3.x-自定义下拉菜单的自定义默认值

  18. 18

    Django Blog-评论功能以表格形式显示作者的下拉菜单

  19. 19

    (Django)更改外键下拉菜单后,如何使“ selected”选项有效?

  20. 20

    页面重新加载后Django保持下拉菜单选择的语言

  21. 21

    选择一个有效的选项Django Filtered下拉菜单

  22. 22

    jQuery克隆的django可选的自动完成下拉菜单不起作用

  23. 23

    Django admin,使用弹出窗口中的选择覆盖下拉菜单

  24. 24

    Django-如何根据数据时间字段限制下拉菜单中的外键选择

  25. 25

    django:在提交下拉菜单时更新数据库

  26. 26

    在Django Admin的Add/Change页面的下拉菜单中选择相关的外键值

  27. 27

    使用 Django,下拉菜单的选定选项不会传递到服务器

  28. 28

    如何基于模型中的外键字段在django中开发下拉菜单

  29. 29

    Django:在 HTML 中使用多个输入字段(带下拉菜单)搜索 Django 模型的多个字段

热门标签

归档