Django のモデルで日本語を使うと UnicodeEncodeError が発生する

2008/04/12 7:16am

ちょっと前から 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 を検索してみて見つけたものだった。

しかし、改めて検索してみると常識っぽいな…。最初の検索の仕方がまずかったか。