2017-09-25 46 views
0

尽管使用了OrderedDict,字典的顺序每次都是变化的。 我在views.py字典的顺序每次变化

from collections import OrderedDict 

from django.shortcuts import render 
import json 

def index(request): 
    with open('./data/data.json', 'r') as f: 
     json_dict = json.loads(f.read()) 
     json_data = OrderedDict() 
     json_data = json_dict 
    return render(request, 'index.html', {'json_data': json_data}) 

写和我index.html中写道

<html> 
 <head> 
 <script type="text/javascript" src="//code.jquery.com/jquery-1.11.0.min.js"></script> 
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/chosen/1.8.2/chosen.jquery.min.js"></script> 
    <script src="//cdnjs.cloudflare.com/ajax/libs/chosen/1.4.2/chosen.jquery.js"></script> 
 <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/chosen/1.4.2/chosen.css"> 
 </head> 
 <body> 
    <select id="mainDD" data-placeholder="Choose" class="chzn-select" style="width:600px;"> 
    {% for i in json_data.items.values %} 
      <option>{{ i }}</option> 
    {% endfor %} 
    </select> 
    <select name="type" id="type1"> 
    {% for j in json_data.type1.values %} 
      <option>{{ j }}</option> 
    {% endfor %} 
    </select> 
    <select name="type" id="type2"> 
    {% for k in json_data.type2.values %} 
      <option>{{ k }}</option> 
    {% endfor %} 
    </select> 
    <select name="type" id="type3"> 
    {% for l in json_data.type3.values %} 
      <option>{{ l }}</option> 
    {% endfor %} 
    </select> 
    <select name="type" id="type4"> 
    {% for m in json_data.type4.values %} 
      <option>{{ m }}</option> 
    {% endfor %} 
    </select> 

    </script> 

    </body> 
</html> 

我的可变&Ĵ&ķ&升&米具有json_data的结果,但这种字典json_data的是不是订单。例如i{'items': [{'---': '---', ‘A’: ‘a’, ‘B’: ‘b’, ‘C: ‘c’, ‘D’: ‘d’}]},但钻取的顺序是b => c => d => a我想要显示a => b => c => d。我认为这可以通过使用OrderedDict )但它是错误的。我应该如何解决这个问题?我应该写什么?

回答

5

您所做的只是使用OrderedDict对象覆盖解析的JSON;这根本没有任何用处。

相反,如the documentation shows,你可以通过这个类为object_pairs_hook参数:

json_dict = json.loads(f.read(), object_pairs_hook=OrderedDict) 
0

你的想法是正确的。使用OrderedDict将保留字典中项目的顺序。但是,有你的代码中的错误:

json_data = OrderedDict() 
json_data = json_dict 

首先初始化json_dataOrderedDict,但在第二个语句您覆盖变量并指定其为json_dict值。

丹尼尔·罗斯曼比我更快,给你更好的答案,我只是天真地做到了这一点:

json_data = OrderedDict(json_dict)