Python 将JSON对象解析为Django模板
我试图将一个JSON对象解析为Django模板,以便将这个JSON对象解析为javascriptPython 将JSON对象解析为Django模板,python,json,django,Python,Json,Django,我试图将一个JSON对象解析为Django模板,以便将这个JSON对象解析为javascript <script> var json = JSON.parse({{citiesByCountry}}); //Loop through json and append to <option> </script> 下面是我的视图如何创建json对象并将其解析为模板: countries = Country.objects.filter(En
<script>
var json = JSON.parse({{citiesByCountry}});
//Loop through json and append to <option>
</script>
下面是我的视图如何创建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 %}
{citiesByCountry%中国家/地区的百分比}
{{国家}
{%endfor%}
但我得到的是字符串中每个字符的一个选项,而不是整个国家的名称
我试图使用.item1
,但这也不起作用
我在上面的示例中没有显示JavaScript代码,因为问题的目的是如何从JSON对象解析和检索字符串。我以后需要使用javascript处理这些数据。具体来说,一旦用户改变了国家,我想填充另一个下拉列表来处理城市,因此我想使用JSON和Javascript来实现这一点,因为我不想每次改变都刷新页面
有什么帮助吗?我想你有两个选择:
标记中的JSON
<script>
var json = JSON.parse({{citiesByCountry}});
//Loop through json and append to <option>
</script>
老实说,我会选择第二个选项,因为我不明白为什么首先需要用JSON将其发送到模板 要回答标题中的问题: 在
(或某处)中,构建您的县阵列:
<script>
var country_objs = [];
{% for country in citiesByCountry%}
country_objs.push({{country|escapejs}});
{% endfor %}
<\script>
var国家/地区(objs)=[];
{citiesByCountry%中的国家/地区的百分比}
国家目标推送({country}escapejs});
{%endfor%}
过滤器的文档:
然后可以在JavaScript中使用它(但不能在Django模板中使用)。例如:
<select id="cities"><\select>
<script>
var $cities_select = $("#cities");
$(country_objs).each(function(){
$cities_select.append('<option value="' + this.id_or_something + '">' + this.name + '<\option>');
});
<\script>
var$cities_select=$(“#cities”);
$(国家/地区)。每个(功能(){
$cities\u select.append(“”+this.name+“”);
});
但从您的示例中,我不明白为什么首先需要用JSON对其进行编码。为什么不直接将dict传递到模板中(通过上下文,就像传递其他内容一样)
附言。
很抱歉使用jQuery,我很懒:)当你使用
citiesByCountry=json.dumps({'a':“b','c':None})
,citiesByCountry
是一个字符串。这就是为什么迭代时会得到一个又一个字符
此字符串表示JSON对象,您可以“影响”JavaScript变量:
var citiesByCountry = {{ citiesByCountry }};
这将输出如下内容:
var citiesByCountry = {"a": "c", "d": null};
但是,考虑到您想要实现的目标:
具体来说,一旦用户改变了国家,我想填充另一个下拉列表来处理城市
我强烈建议您使用checkout,它除了提供自动完成功能外,还提供了一种访问的方式。这将为您节省大量工作。为什么需要将其解析为javascript?在您的示例中,您没有这样做,为什么要将
citiesByCountry
编码为JSON?只需将它作为dict传递给context,比如context={'citiesByCountry':citiesByCountry}
,它就可以工作了。感谢您的回复。我在上面的示例中没有显示JavaScript代码,因为问题的目的是如何从JSON对象解析和检索字符串。我以后需要使用javascript处理这些数据。具体来说,一旦用户更改了国家/地区,我想填充另一个下拉列表来处理城市,因此我想使用JSON和Javascript来实现这一点,因为我不想在每次更改时刷新页面。@xyres我按照你说的做了,在过去工作过,但是现在我想用JavaScript填充城市下拉列表,我不确定是否可以将Python列表解析为JavaScript。@John在这种情况下,Django的模板语法将不起作用。您必须完全在JS中完成此操作。@John啊,注释中还包含了关于JSON原因的其他解释。也许可以对你的问题进行编辑。为了子孙后代,你知道;)谢谢我已经更新了我的问题。我会尝试一下你的解决方案,我会让你知道的。我认为这是有效的。但是由于某种原因,城市值是“未定义的”,我想这与这行$cities\u select.append(“”+this.Name+“”)有关代码>