2016-05-30 3 views
1

をUnicode文字のレンダリング:防止は私が私の見解では、テーブルにクエリを実行していると私は、文脈辞書にデータを渡すDjangoテンプレートで

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

objをJSON形式のstrにシリアル化すると、次のような文字列(例: '[[ "Abyei"]、["Afghanistan"]]);そのため、あなたのforループで単一文字を取得する理由です。 – dazedconfused

+0

django ormを使用せず、簡単なSELECTに対して生のSQLクエリを実行する理由は何ですか? –

+0

@ムハンマドタヒールはい。実際に私はこのテーブルのデータベースにモデルとして渡されていません。テーブルは別のデータベースにあり、私は生の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は既に辞書であり、したがってシリアライズせずに使用できます。

>>> countries = [(u'Abyei',), (u'Afghanistan',)] 
>>> [(country.encode('ascii','ignore'),) for (country,) in countries] 
[('Abyei',), ('Afghanistan',)] 
関連する問題