web-dev-qa-db-ja.com

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

これはリスト全体を返します。最初または最後のn個の要素をどのように削除しますか?

26
Jesse Spielman

これは、sliceフィルターを使用せずに考えると少し簡単です:

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

別の方法は ループ制御拡張 を使用することです:

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

私も同じ問題を抱えていました。簡単な答えです。これにより、site.postsの最後の5つのアイテムが取得されます。

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

私は次のコードを思いつきました:

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

batch(n)フィルターは、リストxsを長さnのサブリストに分割し、firstフィルターはこれらのサブリストの最初を選択します。

9

通常の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
Garrett

@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 %}

どちらを使用するかは、好みによって異なります。

1
Andrew

私にとって、次の単純なコードは機能し、jinjaフィルターのチェーン全体を必要としません。リストフィルターを使用してリストに変換し、通常の配列スライスを実行します(括弧は注意してください)。

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

同じ問題がありましたが、私のデータはリストではなくシーケンスになっており、このコードは両方を処理します。

1
mattgately