将JSON对象解析为Django模板

时间:2016-07-11 10:13:04

标签: python json django

我正在尝试将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来实现这一点,因为我不想在每次更改时刷新页面。

任何帮助?

3 个答案:

答案 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)

我认为你有两个选择:

  1. 使用javascript在<option>标记中解析JSON。

    <script>
        var json = JSON.parse({{citiesByCountry}});
        //Loop through json and append to <option>
    </script>
    
  2. 添加一个非JSON序列化的额外context。这有点多余,但有点简单。

    context = {'citiesByCountry_json': json.dumps(citiesByCountry), 'citiesByCountry': citiesbyCountry}
    
  3. 说实话,我会选择第二个选项,因为我不知道为什么你需要首先将它发送到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方式。这将为您节省很多努力。