2014-01-15 72 views
7

我的Django對象具有屬性「City」。我試圖獲取城市列表並使用Jquery在模板中捕獲它(在X軸上的圖表中使用)。
我的問題是,我不能擺脫unicode和引用列表。
(我設法做一個單一的值)。相反,我stucked這個:
[ 「[[ü'巴黎'],[ü'里昂']]」]將Django的字符串列表傳遞給Javascript

我試過噸的東西,包括JSON。沒有成功。

我的觀點: (實際上,很多的一個嘗試。)

def barchart1(request): 
    city_array =[] 
    for i in [1,MyObject.objects.count()]: 
     objet = get_object_or_404(MyObject, pk=i) 

     cities = [objet.city.city_name] 
     city_array.append(cities) 

return render (request, 'plot3/plot_page.html', {"city_array" : city_array}) 

我的JS:

<script type="text/javascript"> 
    var cities = ["{{ city_array }}"]; 
</script> 

這裏是JS如何讀取由發送上下文查看
[「[[' Paris '],[u '里昂']]「]

這裏是我想獲得
[‘巴黎’,‘里昂’]

它必須是簡單的東西,但我無法弄清楚如何去做吧。 其他帖子不處理字符串列表。

我該怎麼辦?

+0

當你嘗試json時什麼都不起作用? – sk1p

回答

19

當您在模板中執行{{ city_array }}時,您的列表將轉換爲字符串。這是通過在列表上調用repr()來完成的,該列表在其內容上遞歸地調用repr()。由於您的字符串是unicode,因此您會看到這些unicode文字,u'Paris'

「正確」的方式來做到這一點是將數據編碼成JSON,例如您的視圖:

import json 
# ... 
json_cities = json.dumps(city_array) 
# ... 
return render (request, 'plot3/plot_page.html', {"city_array" : json_cities}) 

,然後做

var cities = {{ city_array|safe }}; 

在模板中。

請注意:不要將此用於用戶控制器數據!有關更多信息,請參閱XSS Cheat Sheet by OSWASP和關於Django ticket 17419的討論。爲了防止XSS,你可以使用類似SafeJSONEncoder from the django-cms project的東西。

+0

完美的工作!其實,我嘗試了類似的東西,但我並沒有放棄。它是如何工作的 ? 4小時後,您的幫助是受歡迎的! –

+1

「安全」模板過濾器是一種禁用Django內置HTML轉義的方法,這是一種防止[XSS攻擊](http://en.wikipedia.org/wiki/Cross-site_scripting)的方法。您可以閱讀更多[在文檔中](https://docs.djangoproject。但是至少要記住這一點:如果你確信沒有不可信的用戶輸入會在輸出中未轉義,那麼只能使用'safe'(在/ in/dev/topics/templates /這種情況下,'json.dumps(...)'照顧你)。 – sk1p

+0

@sana恐怕我錯了'json.dumps'的XSS安全性 - 請參閱編輯! – sk1p