Почему pelican / jinja2 не устанавливает переменную снова? - PullRequest
0 голосов
/ 04 октября 2018

У меня есть следующий скрипт:

<div class="blog-archives">
    {% set last_year = 0 %}
    {% for article in dates %}
        {% set year = article.date.strftime('%Y') %}
        {% if last_year != year %}
            <h2 id="{{year }}" title="last_year={{last_year}}"><a href="#{{year}}">{{ year }}</a></h2>
            {% set last_year = year %}
        {% endif %}
        {% set next_year = 0 %}
        {% if not loop.last %}
            {% set next = loop.index0 + 1 %}
            {% set next_article = dates[next] %}
            {% set next_year = next_article.date.strftime('%Y') %}
        {% endif %}
        {% if next_year != year %}
            <article class="last-entry-of-year">
        {% else %}
            <article>
        {% endif %}
        <a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }} {%if article.subtitle %} <small> {{ article.subtitle }} </small> {% endif %} </a>
        <time pubdate="pubdate" datetime="{{ article.date.isoformat() }}">{{ article.locale_date }}</time>
        </article>
    {% endfor %}
</div>

, который, как я думал, приведет к чему-то вроде этого:

enter image description here

Нона самом деле я получаю

enter image description here

Проблема в том, что {% set last_year = year %}, кажется, не выполняется - значение last_year всегда равно 0. Кто-нибудь знаетпочему и как это исправить?

1 Ответ

0 голосов
/ 04 октября 2018

В отличие от Python, в Jinja2 цикл for имеет свое собственное пространство имен;поэтому переменные, которые вы устанавливаете в цикле, являются локальными для цикла, и после выхода из цикла переменная с тем же именем вернется к одной из внешней области видимости.

Вы можете использовать объект namespaceЧтобы обойти эту проблему:

{% set ns = namespace(last_year=0) %}
{% for article in dates %}
    {% set year = article.date.strftime('%Y') %}
    {% if ns.last_year != year %}
        <h2 id="{{year }}" title="last_year={{ns.last_year}}"><a href="#{{year}}">{{ year }}</a></h2>
        {% set ns.last_year = year %}

Для получения подробной информации см. документацию namespace.

...