Django CMS多层下拉菜单 [英] Django CMS Multi-Level Dropdown Menu

查看:134
本文介绍了Django CMS多层下拉菜单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Django CMS的新手,我正尽力避免询问,但这使我发疯. 我制作了一个带有主题和类别模型的Wiki应用程序.我将其挂接到CMS上的站点,并将其添加到菜单中.现在,我希望能够显示所有顶级类别,其子类别和主题,以及这些主题的子类别,等等,在我的菜单上.

Im kinda new to Django CMS and im trying my best to avoid asking, but this one drives me crazy. I made a Wiki app with a Topic, and Category model. I hooked it to a Site on my CMS and added it to my Menu. Now i would like to be able to show all Top-Level categories, their Child Categories & Topics, and the Child categories of these, and so on, on my menu.

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上获得一个自定义子菜单(您在上面看到的那个):

I Already created a menu.py to get a Custom SubMenu on my Wiki (the one you see above):

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?

Now, is it possible to create a Sub-SubMenu, for all Categories with Childs, and their Childs, and their Childs, and so on?

感谢帮助&对不起,英语不好

Thanks for help & sorry for bad english

--

我刚刚发现:

docs.django-cms.org/en/3.0.6/extending_cms/app_integration.html#integration-modifiers

docs.django-cms.org/en/3.0.6/extending_cms/app_integration.html#integration-modifiers

(已删除直接链接以添加2个新链接,对此表示抱歉)

(Removed direct link to add 2 new Links, sorry for that)

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

I think that is what im looking for, i was kinda blind that i didn't found it. I'll try it out and Post the Answer if it worked out.

-编辑(再次):-

修饰符对我不起作用,但我又得到了整整一整, 我再次阅读了文档 ,发现我可以给NavigationNodes一个可选的attr字典,我用parent = c填充了所有类别,这样我就得到了所需的数据,然后我发现真正的

The modifier didn't worked for me, but i got a whole piece further, i read the Docs again, and found that i can give the NavigationNodes an optional attr dictonary, which i filled with all Categories with parent=c, on that way i had the data i needed, then i found that real nice bootstrap dropdown menu, that does exacly what i wanted. So my code until now looks like that:

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.

My next step will be to write the whole "for" loops from the template in a Method, make it recursive with a while loop or something and post the result as Answer.

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

I hope i can help someone with that stuff :)

推荐答案

WOHO!我终于做到了!

WOHO! I finally did it!

base.html

base.html

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

menu.html:

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: (递归的东西从这里开始)

and my dropdownmenu.html: (The recursive stuff starts here)

{% 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:

and the most important, 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)

就这样!

这篇关于Django CMS多层下拉菜单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆