Как получить доступ к части списка в 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 элементов?
Ответы
Ответ 1
Это немного проще, я думаю, без использования фильтра среза:
{% for post in site.posts | reverse | list[0:4] %}
<li>» <a href="/{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
Другим способом является использование расширения элементов управления циклом:
{% for post in site.posts | reverse %}
{%- if loop.index > 4 %}{% break %}{% endif %}
<li>» <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