如何在Jinja2模板中按自定义规则排序MongoDB返回的列表?
在Jinja2模板中按自定义顺序排序列表
问题描述
我从MongoDB数据库查询得到如下Python列表:
db.coll.find() > ["Create", "Infra", "Consolidate"]
希望在Jinja2模板中按指定顺序对该列表排序,目标结果为:
["Infra", "Create", "Consolidate"]
尝试了以下写法但未生效:
{% for item in list|sort("Infra", "Create", "Consolidate") %} {{ item }} {% endfor %}
解决方法
Jinja2的sort过滤器默认仅支持自然排序,无法直接传入自定义顺序参数。你可以通过以下两种方式实现需求:
方法一:在Jinja2模板内处理
先定义目标排序的基准列表,再利用元素在该列表中的索引作为排序键:
{# 定义期望的排序顺序 #} {% set desired_order = ["Infra", "Create", "Consolidate"] %} {# 按自定义顺序排序并遍历 #} {% for item in list|sort(key=lambda x: desired_order.index(x) if x in desired_order else len(desired_order)) %} {{ item }} {% endfor %}
- 逻辑说明:通过
lambda函数获取元素在desired_order中的索引值,以此作为排序依据;若元素不在目标列表中,将其索引设为目标列表长度,让这类元素排在最后。
方法二:在Python后端提前排序(推荐)
如果数据量较大,更高效的方式是在Python代码中提前完成排序,再将结果传递给模板:
# Python后端代码 desired_order = ["Infra", "Create", "Consolidate"] # 从MongoDB获取数据 raw_list = db.coll.find() # 按自定义顺序排序 sorted_list = sorted(raw_list, key=lambda x: desired_order.index(x)) # 将sorted_list传递给Jinja2模板
模板中直接遍历已排序的列表即可:
{% for item in sorted_list %} {{ item }} {% endfor %}
原写法失效原因
Jinja2的sort过滤器语法为sort(reverse=false, case_sensitive=false, attribute=None, key=None),并不支持直接传入排序顺序字符串作为参数,因此你之前的写法无法生效。
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

