【问题标题】:Print (unsorted) dictonary in template django在模板 django 中打印(未排序的)字典
【发布时间】:2016-05-26 18:09:00
【问题描述】:

我有一个字典列表:

Dict = [ {'key1':'value1', 'key2':'value2','key3':'value3'},
        {'key1':'value4', 'key2':'value5','key3':'value6'},
        {'key1':'value7', 'key2':'value8','key3':'value9'}]

我需要按这个顺序显示:

KEY1     KEY2   KEY3
value1  value2  value3
value4  value5  value6
value7  value8  value9

密钥只能按照这个顺序打印一次。

现在我在模板中有这段代码,但值与键的列不匹配:

<table border="1">
    <tr>
        {% for k in listkey %}
            <td>{{ k }}</td>
        {% endfor %}
    </tr>
        {% for raw in dict %}
        <tr>
            {% for k,v in raw.items %}
                <td>{{ v }}</td>
            {% endfor %}
        </tr>
        {% endfor %}
</table>

在views.py中:

listkeys = ['key1','key2','key3']

请帮我解决这个问题。谢谢!

【问题讨论】:

    标签: html django templates dictionary django-templates


    【解决方案1】:

    从您的Dict 列表中,您可以创建以key 值作为键的字典,value 将是上一个列表中所有组合值的list

    # use lowercase variable names and dont pick name like "list", "dict", "tuple" etc.
    
    from collections import defaultdict
    
    your_list = [{'key1':'value1', 'key2':'value2','key3':'value3'},
                 {'key1':'value4', 'key2':'value5','key3':'value6'},
                 {'key1':'value7', 'key2':'value8','key3':'value9'}]
    
    output = defaultdict(list)
    for d in your_list:
        for key, value in d.items():
            output[key].append(value)
    

    输出将是

    defaultdict(list,
                {'key1': ['value1', 'value4', 'value7'],
                 'key2': ['value2', 'value5', 'value8'],
                 'key3': ['value3', 'value6', 'value9']})
    

    关于小写变量名PEP-8

    【讨论】:

      【解决方案2】:

      既然您已经注意到,python 中的 dict 是未排序的,因此除非您在模板中明确指定要访问的值,否则无法以任何顺序循环 dict。

      您可以改为更改数据结构,以构建列表列表:

      another_datastructure = []
      
      for item in Dict:
          # temp would hold value of key1, key2, key3 on current dict entry
          temp = []
          for key in listkeys:
              temp.append(Dict[key])
          another_datastructure.append(temp)
      

      现在你有一个列表列表,每个列表都有 key 跟随 key1, key2 key3 的顺序。然后你可以循环它并保证顺序。

      【讨论】:

      • 谢谢,但我避免使用此解决方案,因为我可能需要获得一个特定值。但是根据您的建议,我认为我将构建两个数据结构:一个仅用于在模板中显示数据(列表列表),另一个用于具有值的计算(字典列表)。
      • 哦,你的意思是你想在模板中获取字典的特定值?这可以通过 {{ dict.key1 }} 来完成。检查这个docs.djangoproject.com/en/1.9/ref/templates/api/…
      猜你喜欢
      • 2017-08-19
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 2012-08-14
      相关资源
      最近更新 更多