読者です 読者をやめる 読者になる 読者になる

文字コードではまる

Djangoで生成するHTMLを、DBに格納しなければならなかった時に、文字コードではまったのでメモっておく。

環境はUbuntu8。たぶん
Django0.97-pre

以下のようなソースでHTMLをDBに格納しようとすると、

item = Item.objects.get(pk=id)
t = loader.get_template(hoge.html')
c = Context({
                      'the_year':the_year,
                 })
# DBにUPDATE 
item.html = t.render(c)
item.save()

以下のようなエラー発生。

Traceback (most recent call last):
  File "hoge.py", line 47, in <module>
    update_flow_amc('1')
  File "hoge.py", line 42, in update_flow
    item.save()
  File "/usr/lib/python2.5/site-packages/django/db/models/base.py", line 272, in save
    self.save_base()
  File "/usr/lib/python2.5/site-packages/django/db/models/base.py", line 312, in save_base
    manager.filter(pk=pk_val)._update(values)
  File "/usr/lib/python2.5/site-packages/django/db/models/query.py", line 311, in _update
    query.execute_sql(None)
  File "/usr/lib/python2.5/site-packages/django/db/models/sql/subqueries.py", line 112, in execute_sql
    super(UpdateQuery, self).execute_sql(result_type)
  File "/usr/lib/python2.5/site-packages/django/db/models/sql/query.py", line 1466, in execute_sql
    cursor.execute(sql, params)
  File "/usr/lib/python2.5/site-packages/django/db/backends/util.py", line 18, in execute
    return self.cursor.execute(sql, params)
  File "/var/lib/python-support/python2.5/MySQLdb/cursors.py", line 151, in execute
    query = query % db.literal(args)
  File "/var/lib/python-support/python2.5/MySQLdb/connections.py", line 247, in literal
    return self.escape(o, self.encoders)
  File "/var/lib/python-support/python2.5/MySQLdb/connections.py", line 180, in string_literal
    return db.string_literal(obj)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 474-475: ordinal not in range(128)

UnicodeEncodeError でググっていると、encode('utf-8')すると良いことがわかった。

なので、

item.html = t.render(c)
    ↓
item.html = t.render(c).encode('utf-8')

に変換したらおK!DBに格納できた。