2009-12-24 42 views

Trả lời

105

Tính đến phiên bản 2.6, bộ lọc loại built-in Jinja2 cho phép bạn chỉ định một thuộc tính để sắp xếp theo:

{% for movie in movie_list|sort(attribute='rating') %} 

Xem http://jinja.pocoo.org/docs/templates/#sort

+0

Cảm ơn, đó là chính xác những gì tôi muốn. Nhân tiện, nó có hoạt động với cả hai loại thuộc tính ... bạn biết __getattr__ và __getitem__? (bởi vì tôi không thể nhớ "phim" là đối tượng hay từ điển) –

+0

@Nick: Tôi đã làm một bài kiểm tra nhanh, và nó dường như hoạt động với cả đối tượng và dicts. –

11

Thông thường, chúng tôi sắp xếp danh sách trước khi đưa nó cho Jinja2. Không có cách nào để chỉ định khóa trong bộ lọc sort của Jinja.

Tuy nhiên, bạn luôn có thể thử {% for movie in movie_list|sort %}. Đó là cú pháp. Bạn không được cung cấp bất kỳ loại thông tin quan trọng nào cho việc sắp xếp.

Bạn cũng có thể thử và viết bộ lọc tùy chỉnh cho việc này. Có vẻ ngớ ngẩn khi bạn có thể sắp xếp trước khi đưa dữ liệu cho Jinja2.

Nếu movie_list là danh sách đối tượng, thì bạn có thể xác định các phương pháp so sánh khác nhau (__lt__, __gt__, v.v.) cho lớp của các đối tượng đó.

Nếu movie_list là danh sách các bộ hoặc danh sách, xếp hạng phải là giá trị đầu tiên. Hoặc bạn sẽ phải phân loại bên ngoài Jinja2.

Nếu movie_list là danh sách từ điển, thì bạn có thể sử dụng dictsort, chấp nhận đặc tả khóa cho sắp xếp. Đọc: http://jinja.pocoo.org/2/documentation/templates#dictsort để biết ví dụ.

+0

Ok, cảm ơn. Tôi đã kết thúc việc phân loại bằng Python trước khi gửi tới mẫu: movie_list = sorted(movie_list, key = lambda movie:movie.rating, reverse = True) Quá tệ, có thể để mẫu quyết định thứ tự sắp xếp! (các công cụ mẫu khác có thể thực hiện việc này không?) –

+1

Các phiên bản gần đây của Jinja2 giờ đây cho phép xác định một thuộc tính để sắp xếp theo. –

+1

@Steve S: Thú vị. Bạn có thực sự đăng câu trả lời ** với thông tin mới của mình không? Vui lòng bao gồm số phiên bản. –

7

Nếu bạn muốn sắp xếp theo thứ tự tăng dần

{% for movie in movie_list|sort(attribute='rating') %} 

Nếu bạn muốn sắp xếp theo thứ tự giảm dần

{% for movie in movie_list|sort(attribute='rating', reverse = True) %} 
Các vấn đề liên quan