Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将JSON对象解析为Django模板_Python_Json_Django - Fatal编程技术网

Python 将JSON对象解析为Django模板

Python 将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

我试图将一个JSON对象解析为Django模板,以便将这个JSON对象解析为javascript

<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来实现这一点,因为我不想每次改变都刷新页面


有什么帮助吗?

我想你有两个选择:

  • 用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+“”)有关