2016-05-30 99 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',)]