Как получить доступ к части списка в Jinja2 - PullRequest
23 голосов
/ 31 октября 2010

Я пытаюсь использовать язык шаблонов 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 элементов?

Ответы [ 6 ]

16 голосов
/ 04 ноября 2010

это немного проще, я думаю, без использования фильтра slice :

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

другой способ - использовать расширение для элементов управления циклом :

{% for post in site.posts | reverse %}
  {%- if loop.index > 4 %}{% break %}{% endif %}
  <li>&raquo; <a href="/{{ post.url }}">{{ post.title }}</a></li>
{%- endfor %}
12 голосов
/ 22 апреля 2013

У меня тоже была такая же проблема.Это простой ответ.Это возвращает последние пять элементов в site.posts:

{% for recent in site.posts[-5:] %}
    {% for post in recent %}
        <li> <a href="/{{ post.url }}">{{ post.title }}</a></li>
    {% endfor %}
{% endfor %}
9 голосов
/ 24 мая 2012

Я придумал следующий код:

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

Фильтр batch(n) разбивает список xs на подсписки длиной n, затем фильтр first выбирает первый из этих подсписков.

4 голосов
/ 04 ноября 2010

Попробуйте подписную запись, как в обычном 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>'

1 голос
/ 04 апреля 2017

Для меня следующий простой код работает и не требует всей цепочки фильтров jinja. Просто используйте фильтр списка для преобразования в список, а затем выполните обычную нарезку массива (обратите внимание на паратезы):

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

У меня была та же проблема, но мои данные были в последовательности, а не в списке, и этот код обрабатывает оба.

1 голос
/ 22 февраля 2017

@ В ответе Андрея правильная идея. Однако, чтобы полностью решить ваш вопрос:

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

Какой из них вы используете, зависит от ваших предпочтений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...