web-dev-qa-db-fra.com

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

J'essaie d'utiliser le langage de modèle jinja2 pour renvoyer les n (disons 5) derniers messages de 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 cependant la liste entière. Comment dépouillez-vous les n premiers ou derniers éléments?

26
Jesse Spielman

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

{% 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 extension des contrôles de boucle :

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

J'ai eu le même problème aussi. C'est une réponse simple. Cela récupère les cinq derniers éléments de site.posts:

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

J'ai trouvé le code suivant:

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

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

9

Essayez la notation en indice, comme en 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
Garrett

La réponse d'Andrey a la bonne idée. Cependant, pour résoudre complètement votre question:

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

Pour moi, le code simple suivant fonctionne et ne nécessite pas toute la chaîne de filtres jinja. Utilisez simplement le filtre de liste pour convertir en liste, puis effectuez un découpage normal du tableau (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
mattgately