如何访问Jinja2中列表的一部分

时间:2010-10-31 07:33:36

标签: python templates jinja2

我正在尝试使用jinja2模板语言返回帖子列表中的最后n个(比方说5个)帖子:

{% for recent in site.posts|reverse|slice(5) %}
    {% for post in recent %}
        <li> <a href="/{{ post.url }}">{{ post.title }}</a></li>
    {% endfor %}
{% endfor %}

这会返回整个列表。你如何剥离第一个或最后一个元素?

8 个答案:

答案 0 :(得分:15)

在没有使用 slice 过滤器的情况下,我认为这有点简单:

{% for post in site.posts | reverse | list[0:4] %}
  <li>&raquo; <a href="/{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}

另一种方法是使用loop controls extension

{% for post in site.posts | reverse %}
  {%- if loop.index > 4 %}{% break %}{% endif %}
  <li>&raquo; <a href="/{{ post.url }}">{{ post.title }}</a></li>
{%- endfor %}

答案 1 :(得分:11)

我也有同样的问题。这是一个简单的答案。这将检索site.posts中的最后五个项目:

{% for recent in site.posts[-5:] %}
    {% for post in recent %}
        <li> <a href="/{{ post.url }}">{{ post.title }}</a></li>
    {% endfor %}
{% endfor %}

答案 2 :(得分:9)

我想出了以下代码:

{% for x in xs | batch(n) | first %}
    ...
{% endfor %}

batch(n)过滤器将列表xs拆分为长度为n的子列表,然后first过滤器会选择这些子列表中的第一个。

答案 3 :(得分:4)

尝试使用下标表示法,就像在普通的Python中一样。例如,要获取最后5个帖子并以相反的顺序显示它们:

import jinja2
tmpl = """\
{%- for col in posts[-5:]|reverse|slice(3) -%}
    {%- for post in col -%}
        {{ post }}
    {%- endfor -%}
    <br>
{%- endfor -%}"""
jinja2.Template(tmpl).render(posts=[1,2,3,4,5,6,7])

生成:u'76<br>54<br>3<br>'

答案 4 :(得分:1)

@ Andrey的答案有正确的想法。但是,要完全解决您的问题:

{% for recent in site.posts|batch(5)|list|last|reverse %}
        <li> <a href="/{{ recent.url }}">{{ recent.title }}</a></li>
{% endfor %}

可替换地:

{% for recent in site.posts|reverse|batch(5)|first %}
        <li> <a href="/{{ recent.url }}">{{ recent.title }}</a></li>
{% endfor %}

您使用的任何一个都取决于您的偏好。

答案 5 :(得分:1)

对我来说,以下简单代码有效,并且不需要整个jinja过滤器链。只需使用列表过滤器转换为列表,然后进行正常的数组切片(注意parantheses):

{% for recent in (site.posts | list)[-5:] %}
  {% for post in recent %}
    <li> <a href="/{{ post.url }}">{{ post.title }}</a></li>
  {% endfor %}
{% endfor %}

我遇到了同样的问题,但我的数据是按顺序而不是列表,这段代码处理这两个问题。

答案 6 :(得分:0)

{% for recent in site.posts[-5:][::-1] %}
    {% for post in recent %}
        <li> <a href="/{{ post['url'] }}">{{ post['title'] }}</a></li>
    {% endfor %}
{% endfor %}
  1. [-5:]-最近5条帖子
  2. [::-1]-倒序

答案 7 :(得分:-1)

要获取最后一个元素,请从数组列表中获取总索引。

例如,您的对象名称是foundappointmentlog

{% set total=foundappointmentlog|length %} //it return length
{{foundappointmentlog[total-1].appointment_result}}  // here you get your last value using index