【问题标题】:How do I slice a looped, conditional list in Jinja?如何在 Jinja 中对循环的条件列表进行切片?
【发布时间】:2021-10-11 11:30:34
【问题描述】:

我正在遍历一个带有条件的列表,如下所示:

{% 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) %}

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

【问题讨论】:

    标签: python loops jinja2 slice pelican


    【解决方案1】:

    如果您使用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>
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      相关资源
      最近更新 更多