คุณจัดเรียงรายการใน Jinja2 ได้อย่างไร?


90

ฉันกำลังพยายามทำสิ่งนี้:

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

แต่ไม่ถูกต้อง ... เอกสารยังคลุมเครือ ... คุณจะทำสิ่งนี้ใน Jinja2 ได้อย่างไร?

คำตอบ:


172

ในเวอร์ชัน 2.6 ตัวกรองการเรียงลำดับในตัวของ Jinja2 ช่วยให้คุณระบุแอตทริบิวต์เพื่อจัดเรียงตาม:

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

ดูhttp://jinja.pocoo.org/docs/templates/#sort


ขอบคุณนั่นคือสิ่งที่ฉันต้องการ อย่างไรก็ตามมันใช้ได้กับแอตทริบิวต์ทั้งสองประเภท ... คุณรู้จักgetattrและgetitemหรือไม่? (เพราะจำไม่ได้ว่า "ภาพยนตร์" เป็นวัตถุหรือพจนานุกรม)
Nick Perkins

@ นิค: ฉันทำการทดสอบอย่างรวดเร็วและดูเหมือนว่าจะใช้ได้กับทั้งวัตถุและคำสั่ง
Steve S

2
ดีสิ่งนี้ใช้ได้กับดัชนีทูเพิลด้วย:list_of_tuples|sort(attribute='0')
Navin

มันอาจจะมีประโยชน์ในการแสดงค่าในการสั่งซื้อกลับ (มันอาจจะเป็นที่น่าสนใจสำหรับการให้คะแนนสำหรับตัวอย่าง) reverse=Trueในกรณีนี้เพียงแค่ใช้ตัวเลือก
Romain

26

หากคุณต้องการเรียงลำดับจากน้อยไปมาก

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

หากต้องการเรียงลำดับจากมากไปหาน้อย

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

14

โดยปกติเราจะเรียงลำดับรายการก่อนที่จะมอบให้กับ Jinja2 ไม่มีวิธีระบุคีย์ในsortตัวกรองของ Jinja

{% for movie in movie_list|sort %}แต่คุณสามารถลอง นั่นคือไวยากรณ์ คุณไม่ต้องให้ข้อมูลสำคัญใด ๆ สำหรับการจัดเรียง

คุณยังสามารถลองเขียนตัวกรองที่กำหนดเองสำหรับสิ่งนี้ได้ ดูเหมือนโง่เมื่อคุณสามารถจัดเรียงก่อนที่จะให้ข้อมูลกับ Jinja2

หากmovie_listเป็นรายชื่อของวัตถุแล้วคุณสามารถกำหนดวิธีการเปรียบเทียบต่างๆ ( __lt__, __gt__ฯลฯ ) สำหรับการเรียนของวัตถุเหล่านั้น

หากmovie_listเป็นรายการสิ่งที่เพิ่มขึ้นหรือรายการต้องให้คะแนนเป็นอันดับแรก หรือคุณจะต้องทำการจัดเรียงนอก Jinja2

หากmovie_listเป็นรายการพจนานุกรมคุณสามารถใช้ได้dictsortซึ่งยอมรับข้อกำหนดสำคัญสำหรับการเรียงลำดับ อ่านสิ่งนี้: http://jinja.pocoo.org/2/documentation/templates#dictsortสำหรับตัวอย่าง


โอเคขอบคุณ. ฉันจบการเรียงลำดับใน Python ก่อนที่จะส่งไปยัง template: <code> movie_list = sorted (movie_list, key = lambda movie: movie.rating, reverse = True) </code> แย่หน่อยอาจเป็นการดีที่จะปล่อยให้เทมเพลตตัดสินใจ ตามลำดับ! (เครื่องมือแม่แบบอื่น ๆ สามารถทำได้หรือไม่)
Nick Perkins

2
Jinja2 เวอร์ชันล่าสุดอนุญาตให้ระบุแอตทริบิวต์เพื่อจัดเรียงตาม
Steve S

1
@Steve S: น่าสนใจ คุณช่วยโพสต์คำตอบพร้อมข้อมูลใหม่ของคุณได้หรือไม่? กรุณาใส่หมายเลขเวอร์ชันด้วย
ล็อต

1
การแก้ไขเล็กน้อย: หลังจากตรวจสอบแหล่งที่มาฉันพบว่าเป็นไปได้ที่จะระบุดัชนีในกรณีที่รายการของคุณสร้างขึ้นจากสิ่งที่คุณทำ (เช่นส่งคืนโดยdict.items()):sort(attribut='1')
Lucas Cimon

@SLott - กรณีการใช้งานสำหรับการเรียงลำดับในเทมเพลตคือ: นี่คือเลเยอร์การแสดงผลซึ่งสามารถแสดงผลหลายมุมมองของข้อมูลเดียวกันซึ่งอาจเป็นสองทีมแยกกัน ทำไมไม่ทำงานนี้ในเลเยอร์การแสดงผลอีกครั้ง ดูเหมือนเป็นสถานที่ที่ดีในการทำลายการมีเพศสัมพันธ์ของความกังวล
Shane
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.