jinja2:如何按照定义的键顺序对字典进行排序?

4

假设我想要像这样展示一些数据:

• b is foo
• a is bar
• c is baz

...但是我的数据集看起来像这样(或者任何其他顺序,因为JSON不关心):

{
"a": "bar",
"b": "foo",
"c": "baz"
}

我该如何告诉Jinja2以a b c的顺序显示我的数据? 如果我不确定元素是否始终存在怎么办?
我尝试了以下代码,但并没有成功:
<ul>
{% for key, value in my_dict.items()|dictsort(by=['b', 'a']) %}
    <li>{{ key }} is {{ value }}</li>
{% endfor %}
</ul>
2个回答

7

您可以遍历一个硬编码的键列表:

<ul>
{% for key in ('b', 'a', 'c') %}
    {% if key in my_dict %}
    <li>{{ key }} is {{ my_dict[key] }}</li>
    {% endif %}
{% endfor %}
</ul>

不存在的键通过 if 测试处理。


我认为这个做法已经接近了。问题是,也许我应该修改我的问题,因为可能会有一些元素 d e f g ... 是我不能忽略的。我是否可以从字典中“弹出” ab,并对其他没有被硬编码循环覆盖到的元素使用默认表示? - allanberry
@niteshade:你可以在循环中跳过ab,然后明确列出它们,也可以为键创建一个列表(list(my_dict))并进行操纵等。 - Martijn Pieters

2
Python的字典是无序的,也许你可以使用collections模块中的OrderedDict
import collections

my_dict = {
    "a": "bar",
    "b": "foo",
    "c": "baz"
}
my_ord_dict = collections.OrderedDict(my_dict)

我考虑过这个问题,但不幸的是我必须处理一个相当严格和不可预测的API。 - allanberry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接