Задержка рендеринга в jinja2 - PullRequest
1 голос
/ 06 октября 2011

Я недавно перешел на jinja2 из шаблонов django, до сих пор у меня не было особых проблем с переносом наших существующих шаблонов, но теперь мне поручено конвертировать наши собственные теги шаблонов 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 %}

Поведение этого делает настройку классов в пунктах меню намного проще, например,menu знает, является ли он первым или последним в списке во время рендеринга, поэтому, если я окружу пункт меню в условии if, он может измениться, будет ли он или другие узлы отображаться первым или последним.

Теперь к дзиндзя.Я пробовал и контекстные функции, и расширения, и макросы, но я не могу получить такое же поведение, потому что я не знаю, как отложить рендеринг пунктов меню до тех пор, пока не узнаю, какие из них будут отрисованы.На данный момент я полностью застрял в том, как продолжить, любая помощь будет оценена.

1 Ответ

1 голос
/ 17 октября 2011

Просто используйте встроенные 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 %}
...