我如何在 Jinja 中分割循环的条件列表?

How do I slice a looped, conditional list in Jinja?

我正在使用如下条件遍历列表:

{% for a in articles if a.category == article.category %}
     <li{% if a == article %} class="current"{% endif %}><a href="{{ SITEURL }}/{{ a.url }}">{{ a.title }}</a></li>
{% endfor %}

但是,我只想显示与当前文章同一类别的最近的 4 篇文章。这是 Pelican,因此当前正在呈现的文章的变量名称为 article。因此有条件的。按照代码的形式,它将列出同一类别中的 篇文章。目前还好,但以后会成为问题。

我试过将列表括在括号中,如下所示:

{% for a in (articles if a.category == article.category)[:4] %}

我也尝试过切片过滤器无济于事:

{% for a in articles if a.category == article.category | slice(4) %}

任何帮助都将是最有价值的。非常感谢。

如果您使用 selectattr 过滤器来过滤您的列表,而不是循环过滤器表达式,您可以获得您想要的:

{% for a in (articles|selectattr('category', 'equalto', article.category)|list)[:4] %}
     <li{% if a == article %} class="current"{% endif %}><a href="{{ SITEURL }}/{{ a.url }}">{{ a.title }}</a></li>
{% endfor %}

给定上述模板和示例代码:

import jinja2

articles = [
        dict(category='foo', title='Article 1 about Foo'),
        dict(category='foo', title='Article 2 about Foo'),
        dict(category='bar', title='Article 1 about Bar'),
        dict(category='baz', title='Article 1 about Baz'),
        dict(category='foo', title='Article 3 about Foo'),
        dict(category='foo', title='Article 4 about Foo'),
        dict(category='foo', title='Article 5 about Foo'),
        dict(category='foo', title='Article 6 about Foo'),
        ]

with open('template.html') as fd:
    template = jinja2.Template(fd.read())

print(template.render(articles=articles))

这会产生:


     <li><a href="/">Article 1 about Foo</a></li>

     <li><a href="/">Article 2 about Foo</a></li>

     <li><a href="/">Article 3 about Foo</a></li>

     <li><a href="/">Article 4 about Foo</a></li>