【问题标题】:Active CMS Menu on apphooked objectapphook 对象上的活动 CMS 菜单
【发布时间】:2018-11-04 14:28:03
【问题描述】:

我有一个使用 Django CMS 3.5.1 和 Django 1.11.11 的站点,它有一个使用 CMS 构建的菜单。它的一页是事件列表。当我单击事件详细信息时,菜单将失去其活动类。

这是我的菜单:

{% for child in children %}
    <li class="js-submenuParent {% if child.selected or child.ancestor %}active{% endif %}">
        <a href="{% if child.children %}javascript:void(0);{% else %}{{ child.attr.redirect_url|default:child.get_absolute_url }}{% endif %}" class="{% if child.children %}submenu-btn js-openSubmenu{% endif %}">{{ child.get_menu_title }}</a>

    {% if child.children %}
        <ul class="submenu js-submenu">
            {% show_menu from_level to_level extra_inactive extra_active template "" "" child %}
        </ul>
    {% endif %}
    </li>
{% endfor %}

我认为child.ancestor 可以解决问题(甚至是child.selected,因为我似乎可以使用{% page_attribute "page_title" %} 访问父母的头衔)但事实并非如此。我是否必须创建一个custom apphook menu 才能做到这一点,还是有更简单的解决方案?

【问题讨论】:

    标签: django django-cms


    【解决方案1】:

    在您为应用程序集成菜单之前,您将应用程序附加到的页面是菜单系统知道的最后一点。

    添加菜单可让您的应用 URL 通过 URL 的 NavigationNode(title, url, id) 对象与菜单应用集成。

    因此,如果您有详细视图,则可以附加一个简单的菜单;

    from menus.base import NavigationNode
    from menus.menu_pool import menu_pool
    from django.utils.translation import ugettext_lazy as _
    from cms.menu_bases import CMSAttachMenu
    
    class EventMenu(CMSAttachMenu):
    
        name = _("event menu")
    
        def get_nodes(self, request):
            nodes = []
            n = NavigationNode(_('detail page'), "/detail", 1)
            nodes.append(n)
            return nodes
    
    menu_pool.register_menu(EventMenu)
    

    这方面的文档在这里; http://docs.django-cms.org/en/latest/how_to/menus.html#integration-attach-menus

    基于上述内容,您还可以根据列表/查询集等生成节点,就像您通过一些调查发现的那样;

    def get_nodes(self, request):
        nodes = []
        for event in Event.objects.published():
            n = NavigationNode(
                event.title,  # title
                event.get_absolute_url(),  # url
                'id_{slug}'.format(slug=event.slug),  # unique ID for node
                visible=False
            )
            nodes.append(n)
        return nodes
    

    【讨论】:

    • 感谢您的解决方案。我试图避免创建菜单,因为我有 3 个 apphooks,但我会尝试一下,如果它有效,请告诉你
    • 效果不如我预期。它还为我拥有的每个事件创建了一个子菜单条目。使用 {% show_menu 0 1 1 1 %} 并将 NavigationNode 级别推到 50 并没有解决它。
    • 等一下,我深入挖掘了 NavigationNode 并找到了 visible 属性。执行NavigationNode(event.title, event.get_absolute_url(), 1, visible=False) 会阻止事件在菜单中显示!
    • 你能用这个稍作修改的版本替换你的解决方案,以便我接受吗? pastebin.com/1Dxgrket 再次感谢!
    • @Mærcos 我已经用基于您的代码的示例添加到我的答案中。我不会将 50 作为所有节点的 ID 传递,因为这是一个唯一值,所以你需要想出一些独一无二的东西
    【解决方案2】:

    这是 3.5.x 和 3.4.x 菜单增强中引入的回归。

    已修复,将于 3.5.3 和 3.4.7 发布

    相关票证:https://github.com/divio/django-cms/issues/6336

    【讨论】:

    • 太棒了!很高兴听到它
    猜你喜欢
    • 2012-03-30
    • 2012-03-28
    • 2011-07-26
    • 2019-01-14
    • 2013-05-09
    • 2015-09-04
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    相关资源
    最近更新 更多