私は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個の要素をどのように削除しますか?
これは、sliceフィルターを使用せずに考えると少し簡単です:
{% for post in site.posts | reverse | list[0:4] %}
<li>» <a href="/{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
別の方法は ループ制御拡張 を使用することです:
{% for post in site.posts | reverse %}
{%- if loop.index > 4 %}{% break %}{% endif %}
<li>» <a href="/{{ post.url }}">{{ post.title }}</a></li>
{%- endfor %}
私も同じ問題を抱えていました。簡単な答えです。これにより、site.postsの最後の5つのアイテムが取得されます。
{% for recent in site.posts[-5:] %}
{% for post in recent %}
<li> <a href="/{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
{% endfor %}
私は次のコードを思いつきました:
_{% for x in xs | batch(n) | first %}
...
{% endfor %}
_
batch(n)
フィルターは、リストxs
を長さn
のサブリストに分割し、first
フィルターはこれらのサブリストの最初を選択します。
通常の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>'
@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 %}
どちらを使用するかは、好みによって異なります。
私にとって、次の単純なコードは機能し、jinjaフィルターのチェーン全体を必要としません。リストフィルターを使用してリストに変換し、通常の配列スライスを実行します(括弧は注意してください)。
{% for recent in (site.posts | list)[-5:] %}
{% for post in recent %}
<li> <a href="/{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
{% endfor %}
同じ問題がありましたが、私のデータはリストではなくシーケンスになっており、このコードは両方を処理します。