Django CMS 多级下拉菜单

2024-04-20

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

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)

现在,是否可以为所有带有子项及其子项、子项等的类别创建一个子子菜单?

感谢您的帮助,抱歉英语不好

- 编辑 : -

我刚刚发现:

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

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

我想这就是我在寻找的东西,我有点盲目,没有找到它。我会尝试一下,如果成功的话发布答案。

-- 编辑(再次):--

修改器对我不起作用,但我进一步得到了整块, 我读了Docs https://django-cms.readthedocs.org/en/3.0.6/extending_cms/api_references.html#menus.base.NavigationNode再次,发现我可以给NavigationNodes一个可选的attr字典,我用parent=c填充所有类别,这样我就有了我需要的数据,然后我发现真的很好引导下拉菜单 http://bootsnipp.com/snippets/featured/multi-level-dropdown-menu-bs3,这正是我想要的。所以到目前为止我的代码看起来像这样:

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 循环或其他东西使其递归,并将结果作为答案发布。

我希望我能帮助别人解决这些问题:)


哇哦!我终于做到了!

基本.html

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

菜单.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)

就是这样!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django CMS 多级下拉菜单 的相关文章

  • Django CMS 多级下拉菜单

    我对 Django CMS 有点陌生 我尽力避免询问 但这让我发疯 我制作了一个带有主题和类别模型的 Wiki 应用程序 我将它连接到我的 CMS 上的一个站点并将其添加到我的菜单中 现在我希望能够在我的菜单上显示所有顶级类别 其子类别和主
  • Android:带有图标的选项菜单“更多列表”

    我喜欢 Android 在选项菜单中自动显示许多菜单项 当屏幕上的菜单项过多时 它会显示 更多 按钮 我想保持这种方式 但是当您按 更多 时弹出的菜单项中没有菜单图标 有什么办法可以让我否决这个吗 如果没有 当用户单击 更多 时如何显示我自
  • 交换数组中的奇数和偶数

    我在这个网站上看到了这段代码 它使用一种方法对数组进行排序 偶数在前面 奇数在数组后面 我想知道你是否可以做同样的事情 除了先出现奇数 然后出现偶数 我尝试过但没有成功 我是java编码新手 我想测试递归 public class Recu
  • 有人可以解释一下这段代码吗?排列代码[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在做一
  • 阿克曼函数的这种实现可以称为尾递归吗?

    我用 C 语言编写了以下代码 我们可以将其称为尾递归实现吗 include
  • 使用 F# 进行循环与递归

    这里的示例代码解决了一个项目欧拉问题 从数字 1 开始 按顺时针方向向右移动 方向 5 x 5 螺旋形成如下 21 22 23 24 25 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13
  • 将字符串转换为个位数并求和

    我花了几个小时尝试寻找解决方案来完成我认为很简单的任务 但我失败了 我有一个由 3 个不同字符组成的字符串 I R O 长度从 1 到 6 E g IRRROO RRORRR IIR RIRRO 每个字符代表一个数字I 1 R 2 O 3我
  • 使用递归查找数组中的最大值

    对于我被要求解决的问题之一 我使用 for 循环找到了数组的最大值 所以我尝试使用递归来找到它 这就是我想到的 public static int findMax int a int head int last int max 0 if h
  • Python 终端菜单?终端着色?终端进度显示?

    我有一个广泛使用 Python 2 风格 的项目 我想知道是否有终端菜单库或类似的东西 我希望通过使用箭头键突出显示选项 一些颜色等简化一些选项 为我的脚本注入一些风味和活力 我隐约记得有一种方法可以制作 bash shell 终端菜单 但
  • 嵌套列表的非递归遍历——在Python中构建类似的嵌套列表

    我需要遍历一个嵌套列表 处理每个非列表项str 并返回保持结构的类似列表 使用递归 这会相当容易 但我需要以这种迭代的方式进行 下面是我的尝试while loop def myiter e a e initial list c final
  • 产量回报延迟迭代问题

    我知道yield return 利用了延迟加载 但我想知道我是否可能滥用迭代器或者很可能需要重构 我的递归迭代器方法返回给定的所有祖先PageNode包括pageNode itself public class PageNodeIterat
  • Twitter Bootstrap:仅将某些菜单项折叠到下拉菜单中

    我想知道如何创建 Twitter Bootstrapnavbar在调整浏览器窗口大小时折叠该菜单中的项目 一次折叠一个或两个项目 我见过的大多数导航栏都将整个导航栏折叠成一个下拉菜单 当窗口大小调整时 基本上隐藏了导航栏上的所有内容 但我仍
  • 文件/文件夹结构的递归搜索

    我正在尝试为返回文件和文件夹列表的 Web 服务构建递归搜索功能 我创建了这两个方法 因此它们充当递归搜索 它首先获取顶级内容 然后将任何文件添加到 fileList 并将任何子文件夹添加到 subFoldersList 我们传入访问级别
  • 嵌套列表递归python的序列

    给定一些数字 n 我想生成一个大小为 n 的列表 其中以下示例显示列表中的第 n 个元素应该如何 对于 n 0 返回 对于 n 1 返回 对于 n 2 返回 对于 n 3 返回 基本上 它采用先前的列表并将它们附加到新列表中 我尝试过以下方
  • Subsonic - 任何人都可以提供使用 Subsonic SimpleRepository 来保存对象列表/数组的示例吗?

    我正在寻找可能的方法来保留以下课程 亚音速简单存储库看起来它可能有效 而且当我问一个人时 人们说它应该有效更一般的问题 https stackoverflow com questions 1527805 orms that work wit
  • 如何停止 CTE 中的递归?

    我有一个数据库表 如下所示 ID PredecessorID Data 43b1e103 d8c6 40f9 b031 e5d9ef18a739 null 55f6951b 5ed3 46c8 9ad5 64e496cb521a 43b1e
  • 方案中的尾递归幂函数

    我在方案中编写尾递归幂函数时遇到问题 我想使用辅助函数来编写该函数 我知道我需要一个参数来保存累计值 但在那之后我就陷入了困境 我的代码如下 define pow tr a b define pow tr h result if b 0 r
  • 第99章 啤酒瓶递归好像不行

    好的 这是我在学习过程中编写的简单代码 void SingTheSong int NumOfBottles if NumOfBottles 0 printf there are simply no more bottles of beer
  • 用于从深层嵌套列表/元组中提取元素的递归函数

    我想编写一个从深层嵌套元组和列表中提取元素的函数 假设我有这样的东西 l THIS THAT a b c THAT d e f 我想要一个没有 这个 和 那个 的简单列表 list a b c d e f 这是我到目前为止所拥有的 def
  • 如何返回n对括号的所有有效组合?

    def paren n lst for x in range n current string join lst solutions list for i in range len current string 1 close curren

随机推荐

  • IntelliJ IDEA:为什么 readLine() 需要两个用户输入,而不是使用 Kotlin 的一个?

    我编写了一个简单的程序 它从控制台获取用户的输入 然后将其打印出来 但是当用户输入时 它会请求第二个用户输入 并且只读取第二个输入 Code fun main args Array
  • 如何在 Mathematica 8 中并行集成

    有人知道如何使用所有核心来计算积分吗 我需要使用并行化或并行表 但如何使用 f r Sum 1 n 2 r 2 n 7 2 n n r 2 n 1 x r 2 n 1 n 0 r 2 Nw Transpose Table f j i 1 j
  • Clojure:在特定命名空间中启动 repl

    我安装了 boot clj 并且希望能够在外部编辑器中编辑 clj 文件 并单独运行一个命令行 REPL 我可以从中调用我在 clj 文件中更改的函数 不需要特殊的重新加载命令 另一件事是我不想手动键入命令来包含命名空间 我只想运行一个将我
  • 无需打开/保存即可评估 Excel 文件

    有没有一种方法可以在不手动打开文件的情况下计算Excel公式 如果 openxlsx 不是最佳选择 请随时推荐其他软件包 谢谢 我的目标是将数据粘贴到 Excel 文件 已经存在 中 其中的公式引用我要粘贴数据的范围 并让 Excel 刷新
  • 播种数据透视表的更好方法

    我有以下表格users roles和数据透视表角色 用户具有以下表结构 users id username password roles id role 角色 用户 id role id user id
  • 配置 IIS 以接收电子邮件

    根据这个答案 https stackoverflow com a 929797 939213可以配置 IIS 来接收电子邮件 这就是我想做的 但答案说它是在下面完成的IIS SMTP under domains 我使用 IIS 管理器连接到
  • 更改自定义产品类型的 WooCommerce“库存”文本(预购)

    一点背景知识 我目前正在使用WooCommerce 插件的产品预订单 https wordpress org plugins product pre orders for woo 由别墅主题 总的来说 除了这一件事之外 它对于我的目的来说效
  • Python argparse 切换标志

    argparse 有什么方法可以解析类似的标志 a b c d foo py s b 应该将 True 存储在dest of s和 False 中dest of b 很像 Windows 所做的attrib或Linuxchmod 目前 我正
  • 在 Mac osx 中将 .a 转换为 .dylib

    是否可以在 Mac osx 中将 a 文件转换为 dylib 文件 我目前有libraryname a 它似乎无法将其包含在我的程序中 因为仅包含 dylib 库 还有一个命令可以通过 mac osx 终端显示程序中使用的静态库吗 是的 这
  • 如何从字符串列表中提取数字?

    我应该如何仅从中提取数字 a 1 2 3 4 5 6 invalid 我努力了 mynewlist s for s in a if s isdigit print mynewlist and for strn in a values map
  • python 中的 Selenium Webdriver:跨测试用例重复使用相同的 Web 浏览器

    Python 新手在这里 我试图在整个测试用例中重复使用相同的浏览器 但是 我不知道如何传递全局变量来完成这项工作 现在 我有一个 main py 看起来像这样 C Python27 python exe import unittest i
  • 您的目标项目“XXX”未引用EntityFramework。这个包是必需的

    谁能指出我出错的方向 我正在尝试使用 SQLite 进行迁移以在 EFCore 上工作 控制台应用程序 NET Core 3 1 运行任何命令 例如enable migrations或update database 都会出现错误 您的目标项
  • 核心动画“翻转”动画

    我希望使用 Core Animation 在 Mac 应用程序中模拟翻转时钟动画 目前我有三个 CALayer 代表数字的上半部分和下半部分 第三个用于代表翻转动画 在以下文章中找到了解决方案 使用 Core Animation 创建 iP
  • HTML 5 音频标记多个文件

    我正在尝试在一个 HTML 5 音频标签中放置两个文件 并依次播放 到目前为止我的代码是
  • 获取设备的方向?

    我有一个相机预览活动 它被迫保持在横向模式 有没有办法可以告诉我手机当前的方向 而不是屏幕方向 基本上我想知道用户是否以纵向模式或横向模式握住手机 以便我可以正确旋转输出捕获的位图 现在它总是以横向模式输出 Thanks if getRes
  • 异常字符串插值不替换变量

    我们正在使用 Scala Play 我试图确保所有 SQL 查询都使用 Anorm 的字符串插值 它适用于某些查询 但许多查询实际上并未在执行查询之前替换变量 import anorm SQL import anorm SqlStringI
  • 获取maven插件在自己的Mojo中的目录路径

    我正在创建一个自定义 Maven 插件 在其中一篇 Mojos 中 我正在读一本Xpp3Dom使用以下代码段从 XML 文件中获取对象 File pluginsFile new File absolute path to file plug
  • Django:如何计算浏览的人数

    我正在 Django 中制作一个简单的 BBS 应用程序 我希望每当有人看到帖子时 该帖子的浏览量 post view no 就会增加 目前我面临两个困难 我需要限制 post view no 的增加 以便一个用户只能增加一次 无论用户刷新
  • 使用 Rails 动态构建 RESTful 路由

    我正在尝试编写一个辅助方法 该方法接受复数资源的名称并返回相应的链接 该方法的本质是 def get link resource link to resource capitalize resource path end 显然resourc
  • Django CMS 多级下拉菜单

    我对 Django CMS 有点陌生 我尽力避免询问 但这让我发疯 我制作了一个带有主题和类别模型的 Wiki 应用程序 我将它连接到我的 CMS 上的一个站点并将其添加到我的菜单中 现在我希望能够在我的菜单上显示所有顶级类别 其子类别和主