为什么pelican / jinja2不再次设置变量?

时间:2018-10-04 10:09:13

标签: jinja2 pelican

我有以下脚本:

<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 :(得分:1)

与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的文档。