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?
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>» <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>» <a href="/{{ post.url }}">{{ post.title }}</a></li>
{%- endfor %}
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 %}
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.
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>'
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.
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.