Django のモデルで日本語を使うと UnicodeEncodeError が発生する
ちょっと前から Django で遊んでいる。教則本代わりの Django Book も含めて、完成度の高さに驚くことしきり。
ただ、実際に管理インターフェースでモデルの詳細を表示しようとすると、UnicodeEncodeError とかいう嫌らしいエラーが出て、萎える。
しかたなく python UnicodeEncodeError django
で検索したら sitecustomize.py でデフォルトのエンコーディングを変更するとか、いや、str 関数に渡したい場合はそりゃそうなんだろうけど、せっかくフレームワーク使ってるんだし、この解決法じゃないんだろうな、っていうのしか見つけられなくてますます萎えてたわけだけど、やっと納得できる解決法が見つかったので残しておく。
ちなみに [](#id1)svn trunk
な Django を使っている。
System Message: WARNING/2 (<string>
, line 7); backlink
Inline literal start-string without end-string.
モデルには str ではなく unicode を実装する
Django オンラインドキュメント和訳の str() と unicode() のどちらを使うべきかに、そのものズバリの回答があった。
モデルに str() メソッドを定義する代わりに unicode() メソッドを実装するよう推奨します. unicode() メソッ ドの中では,モデルのフィールド値を使って好きな値を作成でき,その値がバイト 文字列として適切に表現されるかを気にせず返してかまいません
本当だ。モデルに書いていた str メソッドを unicode に変えるだけで解決しちゃったよ。
force_unicode
エラーのスタックトレースを辿って、Django の django/utils/encodings.py
を見てみると、
def force_unicode(s, encoding='utf-8', strings_only=False, errors='strict'):
...
if not isinstance(s, basestring,):
if hasattr(s, '__unicode__'):
s = unicode(s)
else:
s = unicode(str(s), encoding, errors)
エラーは最後の str 関数の呼び出しで起きているわけだが、その前に hasattr で unicode を調べているのが分かると思う。実をいうと上のドキュメントは、ここから unicode を検索してみて見つけたものだった。
しかし、改めて検索してみると常識っぽいな…。最初の検索の仕方がまずかったか。