Làm thế nào để bạn sắp xếp một danh sách trong Jinja2?


88

Tôi đang cố gắng làm điều này:

 {% for movie in movie_list | sort(movie.rating) %}

Nhưng điều đó không đúng ... tài liệu mơ hồ ... làm thế nào để bạn làm điều này trong Jinja2?

Câu trả lời:


170

Kể từ phiên bản 2.6, bộ lọc sắp xếp tích hợp của 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


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

@Nick: Tôi đã thực hiện một bài kiểm tra nhanh, và nó dường như hoạt động với cả đối tượng và đường nét.
Steve S

2
Tuyệt vời, điều này cũng hoạt động cho một chỉ số tuple:list_of_tuples|sort(attribute='0')
Navin

Có thể hữu ích khi hiển thị các giá trị theo thứ tự ngược lại (ví dụ: nó có thể thú vị đối với xếp hạng), trong trường hợp này chỉ cần sử dụng tùy chọn reverse=True.
Romain

25

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

14

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 một khóa trong sortbộ lọc 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 để sắp xếp.

Bạn cũng có thể thử và viết mộ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_listlà danh sách các đối tượng, sau đó bạn có thể xác định phương pháp so sánh khác nhau ( __lt__, __gt__, vv) cho các lớp của các đối tượng.

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

Nếu movie_listlà một danh sách các từ điển, thì bạn có thể sử dụng dictsort, nó chấp nhận một đặc điểm kỹ thuật chính để sắp xếp. Đọc phần này: http://jinja.pocoo.org/2/documentation/templates#dictsort để làm ví dụ.


Được rồi cảm ơn. Cuối cùng, tôi đã sắp xếp bằng Python trước khi gửi đến mẫu: <code> movie_list = sorted (movie_list, key = lambda movie: movie.rating, reverse = True) </code> Thật tệ, có thể tốt khi để mẫu quyết định theo thứ tự sắp xếp! (Có thể các mẫu động cơ khác làm điều này?)
Nick Perkins

2
Các phiên bản gần đây của Jinja2 hiện cho phép chỉ định một thuộc tính để sắp xếp theo.
Steve S

1
@Steve S: Thật thú vị. Bạn có thể thực sự đăng một câu trả lời với thông tin mới của bạn? Vui lòng bao gồm số phiên bản.
S.Lott

1
Sửa chữa nhỏ: sau khi kiểm tra nguồn tôi phát hiện ra rằng người ta có thể xác định một chỉ số trong trường hợp danh sách của bạn được làm từ các bộ (ví dụ như lợi nhuận của dict.items()):sort(attribut='1')
Lucas Cimon

@ Dưới - trường hợp sử dụng để sắp xếp trong mẫu là: Đây là lớp hiển thị - có khả năng hiển thị nhiều chế độ xem của cùng một dữ liệu - đây có thể là hai nhóm riêng biệt. Tại sao điều này không hoạt động lại trong lớp hiển thị? có vẻ như là một nơi tốt để phá vỡ mối quan tâm.
Shane C. Mason
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.