2016-05-30 248 views
1

我執行查詢到我的位子在Django模板中的Unicode字符和我的數據傳遞給語境詞典:防止渲染

conn = psycopg2.connect(constr) 
cur = conn.cursor() 

sqlstr = "SELECT DISTINCT adm0_name FROM wld_bnd_adm0_gaul_2015 ORDER BY adm0_name;" 
cur.execute(sqlstr) 
countries = cur.fetchall() 
ctx['countries'] = countries 

然後,我要呈現在我的模板數據以下:

{% if countries %} 
    {% for cntr in countries %} 
     <li><a href="#" id= {{ cntr }}>{{ cntr }}</a></li> 
    {% endfor %} 
{% endif %} 

的問題是,我得到一個Unicode格式如下:

[(u'Abyei',), (u'Afghanistan',), (u... 

我試着我的數據轉換的視圖中的JSON爲:

countries = json.dumps(countries) 

但實際上,後來當我呈現模板中的數據分開我得到的JSON字符串的每一個字符。

+1

,你會得到一個字符串(如:「[ 「阿卜耶伊」],[「阿富汗」]]');這就是爲什麼你在循環中獲得單個字符的原因 – dazedconfused

+0

任何你沒有使用django orm並對原始SQL查詢進行簡單SELECT的原因? –

+0

@Muhammad Tahir是的。其實我沒有在我的DB這個表格中作爲模型傳遞。該表位於不同的數據庫中,我直接執行原始SQL查詢。如果我在django db中將它作爲模型傳遞,也許會更好。 – user1919

回答

1

正如文檔fetchall中提到的那樣,返回元組列表,因此每個國家名稱都在列表中的元組內。您需要將列表展平以獲取國家/地區列表。

countries = cur.fetchall() 
countries = [c[0] for c in countries] 
ctx['countries'] = countries 
1

我假設你使用的是Python2。

documentation,這裏的調用json.dumps後,你會得到什麼:

>>> json.dumps([(u'Abyei',), (u'Afghanistan',)]) 
'[["Abyei"], ["Afghanistan"]]' 

既然你從詞典序列化一個JSON格式的字符串,當你重複它,你會在每個迭代上得到一個字符。這就解釋了爲什麼當你渲染數據時你會得到單個字符。

您的countries已經是字典,因此可以不用序列化;如果你要轉換的unicode字符串,你可以這樣做:因爲調用`json.dumps`,其序列obj轉換爲JSON格式的STR後

>>> countries = [(u'Abyei',), (u'Afghanistan',)] 
>>> [(country.encode('ascii','ignore'),) for (country,) in countries] 
[('Abyei',), ('Afghanistan',)]