Mezzanine中的自定义菜单

时间:2014-10-13 09:48:52

标签: django mezzanine

我关注了mezzanine tree.html

{% if page_branch_in_menu %}
<ul class="nav nav-list navlist-menu-level-{{ branch_level }}">
  {% for page in page_branch %}
  {% if page.in_menu %}
  {% if page.is_current_or_ascendant or not page.is_primary %}
     <li class="
        {% if page.is_current %} active{% endif %}
        {% if page.is_current_or_ascendant %} active-branch{% endif %}
        " id="tree-menu-{{ page.html_id }}">
        <a href="{{ page.get_absolute_url }}">{{ page.title }}</a>
        {% if page.has_children_in_menu %}{% page_menu page %}{% endif %}
     </li>
  {% endif %}
  {% endif %}
  {% endfor %}
</ul>
{% endif %}

在base.html我有以下块:

<div class="col-md-2 left">
    {% block left_panel %}
    <div class="panel panel-default tree">{% page_menu "pages/menus/tree.html" %}</div>
    {% endblock %}
</div>

问题是在菜单为空的某些页面上,css样式应用于具有空菜单列表的div,用户可以观察空容器。在html中它看起来像:

<div class="col-md-2 left">
<div class="panel panel-default tree">
<ul class="nav nav-list navlist-menu-level-0"></ul>
</div>
</div>

我可以用.nav:empty {display:none;}隐藏孩子ul但是父母仍然可见。以下是关于类似问题的讨论::empty selector for parent element

是否可以使用Mezzanine模板标签解决此问题?

2 个答案:

答案 0 :(得分:2)

{% if page_branch %}没有帮助,因为它的所有页面都不是in_menu。 所以最好在上下文之前过滤它们。

menu_pages = page_branch.filter(in_menu=True)

此外,您应该将if块放在div.tree

之上
{% if menu_pages %}
    <div class="panel panel-default tree">{% page_menu "pages/menus/tree.html" %}</div>
{% endif %}

另一种方法是编写自定义过滤器

{% with menu_pages=page_branch|filter_in_menu %}
    {% if menu_pages %}
        ...
    {% endif %}
{% endif %}

但是无法使用内置语法或Mezzanine标记对查询集应用额外过滤器。

答案 1 :(得分:0)

您可以使用if标记包装代码。

{% if page_branch %}
<ul>
{% for page in page_branch %}
{% if page.in_menu %}
{% if page.is_current_or_ascendant or not page.is_primary %}
<li>
    {% if not page.is_primary %}
    <a href="{{ page.get_absolute_url }}">{{ page.title }}</a>
    {% endif %}
    {% page_menu page %}
</li>
{% endif %}
{% endif %}
{% endfor %}
</ul>
{% endif %}