2010-10-31 46 views
19

我試圖使用Jinja2的模板的langauge返回最後n(例如,5)在我的職位列表的帖子:如何訪問列表的一部分在Jinja2的

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

這是返回整個列表雖然。你如何剝離第一個或最後n個元素?

回答

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>'

+0

這很好!謝謝! – 2010-11-04 04:08:45

14

這是我想簡單一點,而不使用過濾器:

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

我想出了以下代碼:

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

batch(n)濾波器將列表xs入長度n的子列表,則first濾波器選擇第一這些子列表的。

+0

我認爲這應該是被接受的答案。只要注意,如果想要使用'last'而不是'first',她必須首先通過'list'過濾器傳遞'batch'的輸出。 – Andrew 2017-02-22 18:42:36

10

我也有同樣的問題。這是一個簡單的答案。這檢索site.posts中的最後五項:

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

@安德烈的答案有正確的想法。不過,要完全解決你的問題:

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

你使用哪一個取決於你的喜好。

0

對我來說,下面的簡單代碼工作並不需要整個jinja過濾鏈。只需使用列表過濾器轉換成列表,然後進行正常的陣列切片(注意括號):

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

我有同樣的問題,但我的數據是在一個序列,而不是一個列表,該代碼同時處理。