为什么我的字典在django模板中没有排序?

时间:2016-02-17 17:40:03

标签: python django dictionary

我手动订购了一个名为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>

1 个答案:

答案 0 :(得分:1)

如评论中所述,由于没有订单,因此无法对常规字典进行排序。

有不同的方法:

  1. OrderedDict in View
  2. 不要在模板中创建它,但要在视图中将其添加到上下文中。如果您在多个视图中需要它,请创建一个上下文处理器,将其添加到您的所有视图中。如果你选择这种方式,你可以保持你现在拥有的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

    1. 模板解决方案
    2. 如果您真的想在模板中创建该列表,则必须将其结构更改为真实列表。您可以将其更改为元组列表或字典列表。

      使用词典列表可以使用内置dictsort的模板。看看文档: https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#dictsort

      注意:

      就个人而言,我建议不要在模板中创建任何数据结构。将它们分开移动到一个常规文本文件中,从中加载它(你可以使用json或yaml来构造它),甚至创建一个Model来使它可以通过Django Admin维护。