我如何在 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>
我正在使用如下条件遍历列表:
{% 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>