我正在视图中对表执行查询,并将数据传递给上下文字典:
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字符串的每个字符。
答案 0 :(得分:1)
如文档fetchall
中所述,返回元组列表,因此每个国家/地区名称都在列表中的元组内。您需要将列表展平以获取国家/地区列表。
countries = cur.fetchall()
countries = [c[0] for c in countries]
ctx['countries'] = countries
答案 1 :(得分:1)
我假设你正在使用Python2。
从documentation开始,这是调用json.dumps
后的内容:
>>> json.dumps([(u'Abyei',), (u'Afghanistan',)])
'[["Abyei"], ["Afghanistan"]]'
由于您从字典中获取了一个序列化的单个JSON格式字符串,因此当您迭代它时,您将在每次迭代时获得一个字符。这解释了在渲染数据时获得单个字符的原因。
您的countries
已经是字典,因此无需序列化即可使用;如果你想转换unicode字符串,你可以这样做:
>>> countries = [(u'Abyei',), (u'Afghanistan',)]
>>> [(country.encode('ascii','ignore'), ) for (country, ) in countries]
[('Abyei',), ('Afghanistan',)]