Comment puis-je accéder à une partie d'une liste dans Jinja2

j'essaye d'utiliser le Jinja2 templating langauge pour retourner les derniers n (disons, 5) messages dans ma liste de messages:

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

ceci renvoie la liste complète. Comment enlever le premier ou le dernier n éléments?

21
demandé sur Brad Mace 2010-10-31 10:33:36

6 réponses

c'est un peu plus simple je pense sans l'utilisation du tranche filtre:

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

une autre façon est d'utiliser le commandes de boucle d'extension:

{% for post in site.posts | reverse %}
  {%- if loop.index > 4 %}{% break %}{% endif %}
  <li>&raquo; <a href="/{{ post.url }}">{{ post.title }}</a></li>
{%- endfor %}
15
répondu Rico Schiekel 2015-11-11 04:22:45

j'ai eu le même problème aussi. C'est une réponse simple. Cela permet d'extraire les cinq derniers éléments du site.posts:

{% for recent in site.posts[-5:] %}
    {% for post in recent %}
        <li> <a href="/{{ post.url }}">{{ post.title }}</a></li>
    {% endfor %}
{% endfor %}
11
répondu joemurphy 2016-02-25 18:20:08

je suis venu avec le code suivant:

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

batch(n) filtre divise la liste xs en sous-listes de longueur n, puis first filter sélectionne la première de ces sous-listes.

6
répondu Andrey Vlasovskikh 2012-05-23 23:31:47

essayez la notation en indice, comme dans le Python normal. Par exemple, pour prendre les 5 derniers messages et les afficher dans l'ordre inverse:

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])

produit: u'76<br>54<br>3<br>'

4
répondu Garrett 2010-11-03 21:35:32

la réponse de@Andrey a la bonne idée. Toutefois, pour bien résoudre votre problème:

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

alternativement:

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

celui que vous utilisez dépend de vos préférences.

1
répondu Andrew 2017-02-22 19:11:44

pour moi, le code simple suivant fonctionne et ne nécessite pas toute la chaîne de filtres jinja. Il suffit d'utiliser le filtre de liste pour convertir en liste et ensuite faire le découpage de Tableau normal (notez les paranthèses):

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

j'ai eu le même problème, mais mes données étaient dans une séquence plutôt qu'une liste et ce code gère les deux.

1
répondu mattgately 2017-04-04 13:29:28