Подтвердить что ты не робот

Как получить доступ к части списка в Jinja2

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 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>'

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

Чтобы получить последний элемент, получите общий индекс из списка массивов.

Например, имя вашего объекта - foundappointmentlog.

{% set total=foundappointmentlog|length %} //it return length
{{foundappointmentlog[total-1].appointment_result}}  // here you get your last value using index