2010-10-31 49 views
19

Tôi đang cố gắng sử dụng langauge jinja2 khuôn mẫu để trả lại n cuối cùng (ví dụ 5) bài viết nào trong danh sách bài viết của tôi:Làm thế nào để truy cập vào một phần của một danh sách trong Jinja2

{% for recent in site.posts|reverse|slice(5) %} 
    {% for post in recent %} 
     <li> <a href="/{{ post.url }}">{{ post.title }}</a></li> 
    {% endfor %} 
{% endfor %} 

này được trả lại toàn bộ danh sách mặc dù. Làm cách nào để bạn loại bỏ phần tử n đầu tiên hoặc cuối cùng?

Trả lời

4

Hãy thử ký hiệu chỉ số con, như trong Python bình thường. Ví dụ, để lấy 5 bài viết cuối cùng và hiển thị chúng theo thứ tự ngược lại:

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]) 

sản xuất: u'76<br>54<br>3<br>'

+0

Điều đó hoạt động tuyệt vời! Cảm ơn! –

14

này là một chút đơn giản tôi nghĩ rằng không có việc sử dụng các lát lọc:

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

một cách khác là sử dụng loop controls extension:

{% for post in site.posts | reverse %} 
    {%- if loop.index > 4 %}{% break %}{% endif %} 
    <li>&raquo; <a href="/{{ post.url }}">{{ post.title }}</a></li> 
{%- endfor %} 
6

tôi đã đưa ra đoạn mã sau:

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

Bộ lọc batch(n) chia tách một danh sách xs vào danh sách con có độ dài n, sau đó bộ lọc first chọn đầu tiên của các danh sách con.

+0

Tôi nghĩ rằng đây nên là câu trả lời được chấp nhận. Chỉ cần lưu ý rằng nếu một người muốn sử dụng 'last' thay vì' first', trước tiên cô ấy phải chuyển đầu ra của 'batch' thông qua bộ lọc' list'. – Andrew

10

Tôi cũng gặp vấn đề tương tự. Đó là một câu trả lời đơn giản. Điều này truy lục năm mục cuối cùng trong site.posts:

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

@ Câu trả lời của Andrey có ý tưởng đúng. Tuy nhiên, để giải quyết đầy đủ câu hỏi của bạn:

{% for recent in site.posts|batch(5)|list|last|reverse %} 
     <li> <a href="/{{ recent.url }}">{{ recent.title }}</a></li> 
{% endfor %} 

Hoặc:

{% for recent in site.posts|reverse|batch(5)|first %} 
     <li> <a href="/{{ recent.url }}">{{ recent.title }}</a></li> 
{% endfor %} 

Cho dù bạn sử dụng phụ thuộc vào sở thích của bạn.

0

Đối với tôi, mã đơn giản sau đây hoạt động và không yêu cầu toàn bộ chuỗi bộ lọc jinja. Đơn giản chỉ cần sử dụng bộ lọc danh sách để chuyển đổi vào danh sách và sau đó làm mảng cắt bình thường (chú ý parantheses):

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

tôi đã cùng một vấn đề, nhưng dữ liệu của tôi là trong một chuỗi chứ không phải là một danh sách và mã này xử lý cả hai .

Các vấn đề liên quan