我手动订购了一个名为lang_selection_list
的词典。我想循环遍历该列表,并使用key, val
设置select/options tag
问题:我的循环创建的输出似乎是随机顺序而我不知道为什么?
问题:如何循环lang_selection_list
以便我的选项顺序与我写入的键值顺序相同?
{% var as lang_selection_list %}
{
"af_ALL": "Afrikaans",
"az_ALL": "Azərbaycanca",
"id_ALL": "Bahasa Indonesia",
"ca_ALL": "Català",
"si_ALL": "සිංහල",
}
{% endvar %}
<select>
{% for key,val in lang_selection_list.items %}
<option value="/{{key}}/index.html">{{val}}</option>
{% endfor %}
</select>
答案 0 :(得分:1)
如评论中所述,由于没有订单,因此无法对常规字典进行排序。
有不同的方法:
不要在模板中创建它,但要在视图中将其添加到上下文中。如果您在多个视图中需要它,请创建一个上下文处理器,将其添加到您的所有视图中。如果你选择这种方式,你可以保持你现在拥有的for循环。 OrderedDict的创建如下所示:
langs = OrderedDict([
("af_ALL", "Afrikaans"),
("az_ALL", "Azərbaycanca"),
("id_ALL", "Bahasa Indonesia"),
("ca_ALL", "Català"),
("si_ALL", "සිංහල"),
])
请参阅上下文处理器上的https://docs.djangoproject.com/en/1.9/ref/templates/api/#writing-your-own-context-processors。
如果您真的想在模板中创建该列表,则必须将其结构更改为真实列表。您可以将其更改为元组列表或字典列表。
使用词典列表可以使用内置dictsort
的模板。看看文档:
https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#dictsort
注意:
就个人而言,我建议不要在模板中创建任何数据结构。将它们分开移动到一个常规文本文件中,从中加载它(你可以使用json或yaml来构造它),甚至创建一个Model来使它可以通过Django Admin维护。