在jinja2中延迟渲染

时间:2011-10-06 19:27:37

标签: django-templates jinja2

我最近从django模板转换为jinja2,到目前为止,移植现有模板并没有太多麻烦,但现在我的任务是转换我们的自定义django模板标签。我遇到问题的是一个标签,用于创建类似于以下结构的菜单:

{% createmenu mainmenu %}
    <!-- syntax: menuitem url-name-to-resolve <url-args> <url-kwargs> "Url Label" -->
    {% menuitem main-url-name 'Home' %}
    {% menuitem some-other-url-name obj.foo obj.bar 'Page2' %}
    {% if some_condition %}
        {% menuitem some-other-url-name obj.foo obj.bar 'Page2' %}
    {% endif %}
{% menutemplate %}
    <li class="
       {% if menu.is_selected %}selected{% endif %}
       {% if menu.is_first %}first{% endif %}
       {% if menu.is_last %}last{% endif %}">
       {% if menu.is_active %}
           <a href="{{menu.url}}">{{menu.label}}</a>
       {% else %}
           <span class="inactive">{{menu.label}}</span>
       {% endif %}
    </li>
{% endcreatemenu %}

这样做会使菜单项上的设置类变得更加简单,例如,菜单在渲染时知道它是列表中的第一个还是最后一个,所以如果我在if条件中包含一个菜单项,它可能会更改它或其他节点是第一个还是最后一个显示。

现在来到jinja。我已经尝试了上下文功能,扩展和宏,但我似乎无法获得相同的行为,因为我不知道如何延迟菜单项的呈现,直到我知道将要呈现哪些。目前我完全坚持如何继续,任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

只需使用内置的loop变量firstlast属性:

{% for item in menu_items %}
<li class="
{%- if loop.first %}first{% endif -%}
{%- if loop.last %}last{% endif -%}">
{# The remainder of your conditions and rendering go here #}
</li>
{% endfor %}