我正在尝试将JSON对象解析为Django模板,以便我可以将此json对象解析为javascript。
这里我的视图如何创建json对象并将其解析为模板:
countries = Country.objects.filter(Enabled=True)
citiesByCountry = {}
for country in countries:
citiesInCountry = City.objects.filter(Enabled=True, Country=country)
cities = []
for city in citiesInCountry:
cities.append(city.Name)
citiesByCountry[country.Name] = cities
context = {'citiesByCountry': json.dumps(citiesByCountry)}
return render(request, 'index.html', context)
现在我想以这种方式将所有密钥(将是国家/地区)检索到我的模板:
{% for country in citiesByCountry%}
<option>{{ country }}</option>
{% endfor %}
但我得到的是字符串中每个字符的选项,而不是整个国家/地区名称。
我尝试使用.item1
,但这也不起作用。
我在上面的示例中没有显示JavaScript代码,因为问题的目的是如何从JSON对象解析和检索字符串。我需要稍后使用javascript处理这些数据。具体来说,一旦用户更改国家/地区,我想填充另一个将处理城市的下拉列表,因此我想使用JSON和Javascript来实现这一点,因为我不想在每次更改时刷新页面。
任何帮助?
答案 0 :(得分:2)
在标题中回答你的问题:
在<head>
(或某处),构建您的县数组:
<script>
var country_objs = [];
{% for country in citiesByCountry%}
country_objs.push({{country|escapejs}});
{% endfor %}
<\script>
过滤器的文档:https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#escapejs
然后你可以在JavaScript中使用它(但不能在Django模板中使用它)。例如:
<select id="cities"><\select>
<script>
var $cities_select = $("#cities");
$(country_obj).each(function(){
$cities_select.append('<option value="' + this.id_or_something + '">' + this.name + '<\option>');
});
<\script>
但是从你的例子中我不知道为什么你需要首先用JSON编码它。为什么不直接将dict传递到模板中(通过上下文,就像其他所有内容一样)?
P.S。 很抱歉使用jQuery,我只是懒惰:)
答案 1 :(得分:1)
我认为你有两个选择:
使用javascript在<option>
标记中解析JSON。
<script>
var json = JSON.parse({{citiesByCountry}});
//Loop through json and append to <option>
</script>
添加一个非JSON序列化的额外context
。这有点多余,但有点简单。
context = {'citiesByCountry_json': json.dumps(citiesByCountry), 'citiesByCountry': citiesbyCountry}
说实话,我会选择第二个选项,因为我不知道为什么你需要首先将它发送到JSON模板。
答案 2 :(得分:1)
执行citiesByCountry = json.dumps({'a': "b", 'c': None})
时,citiesByCountry
是一个字符串。这就是为什么你在迭代它时获得字符后的字符。
这个字符串代表一个JSON对象,你可以“影响”原来的JavaScript变量:
var citiesByCountry = {{ citiesByCountry }};
将输出如下内容:
var citiesByCountry = {"a": "c", "d": null};
但是,考虑一下你想要实现的目标:
具体一旦用户更改国家/地区,我想填充另一个将处理城市的下拉列表
我强烈建议您结帐django-autocomplete-light,除了提供自动完成功能外,还提供filter results based on other fields方式。这将为您节省很多努力。