2016-07-11 121 views
2

我想解析一個JSON對象到Django模板,以便我可以解析這個JSON對象到JavaScript。解析JSON對象到Django模板

這裏怎麼我的觀點創建和解析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但是這也不能工作。

我沒有看到前面的問題的意圖是如何解析和檢索JSON對象的字符串在我的示例JavaScript代碼。我需要稍後使用JavaScript處理這些數據。具體來說,一旦用戶改變國家,我想填充另一個將處理城市的下拉菜單,因此我認爲使用JSON和Javascript來實現這一點,因爲我不想刷新每次更改的頁面。

任何幫助?

+2

爲什麼你需要解析它爲JavaScript?在你的例子中,你沒有這樣做 –

+0

爲什麼你編碼'citiesByCountry'到JSON?只要將它作爲上下文的字典傳遞,如'context = {'citiesByCountry':citiesByCountry}',它就可以工作。 – xyres

+0

感謝您的答覆。我沒有在上面的示例中顯示JavaScript代碼,因爲問題的目的是如何從JSON對象中解析和檢索字符串。我需要稍後使用JavaScript處理這些數據。具體來說,一旦用戶改變國家,我想填充另一個將處理城市的下拉菜單,因此我認爲使用JSON和Javascript來實現這一點,因爲我不想刷新每次更改的頁面。 – John

回答

1

我認爲你有兩個選擇:

  1. 解析JSON在<option>標籤用JavaScript。

    <script> 
        var json = JSON.parse({{citiesByCountry}}); 
        //Loop through json and append to <option> 
    </script> 
    
  2. 添加一個額外的context不是JSON序列。這有點多餘,但有點簡單。

    context = {'citiesByCountry_json': json.dumps(citiesByCountry), 'citiesByCountry': citiesbyCountry} 
    

說實話,我會去的第二個選項,因爲我不明白爲什麼你需要把它發送到模板中JSON擺在首位。

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對其進行編碼。爲什麼不直接傳遞一個字典(通過上下文,就像其他所有內容一樣)?

P.S. 對不起,使用jQuery,我只是懶惰:)

+0

@John啊,評論包含關於爲什麼JSON的附加解釋。也許編輯你的問題。爲了後代,你知道;) – frnhr

+0

謝謝。我更新了我的問題。我會試一試你的解決方案,我會讓你知道的。 – John

+0

我認爲這工作。但由於某種原因,城市價值是'未定義',我猜這與'$ cities_select.append('

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。這將爲您節省很多努力。