我最近从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。我已经尝试了上下文功能,扩展和宏,但我似乎无法获得相同的行为,因为我不知道如何延迟菜单项的呈现,直到我知道将要呈现哪些。目前我完全坚持如何继续,任何帮助将不胜感激。
答案 0 :(得分:1)
只需使用内置的loop
变量first
和last
属性:
{% 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 %}