Djangoのエラーメッセージがugettext_lazyに。

ちょっと前から Django のtrunkを使うようになっているのですが、 r6520 から r6635 にアップデートしたらログイン部分がエラー吐いて動かなくなった。

ちょっと調べてみると、 r6625newforms のエラーメッセージが ugettext から ugettext_lazy に変更されてる。 これが simplejson がシリアライズ出来なくてエラーになっているみたい。

今まであんまり意識した事がなかったので、ちょっとだけ実験してみた。

>>> from django.utils.translation import ugettext, ugettext_lazy
>>> s = u'This field is required.'

>>> # ugettextだとこうなる。
>>> ugettext(s)
u'This field is required.'
>>> print ugettext(s)
This field is required.

>>> # ugettext_lazyだとこうなる。
>>> ugettext_lazy(s)
<django.utils.functional.__proxy__ object at 0x24a0270>
>>> print ugettext_lazy(s)
<django.utils.functional.__proxy__ object at 0x24a2330>

どうやら ugettext_lazy を使うと、 __proxy__ ってオブジェクトが返ってくるらしい。 こいつを simplejson がシリアライズ出来なくてエラーになってた。

ココでもうちょっと実験してみる。

>>> lazy = ugettext_lazy(s)

>>> # unicodeしてみる。
>>> unicode(lazy)
u'This field is required.'
>>> print unicode(lazy)
This field is required.

>>> # encodeメソッドを呼んでみる。
>>> lazy.encode('utf-8')
>>> 'This field is required.'
>>> print lazy.encode('utf-8')
This field is required.

>>> # force_unicodeしてみる。
>>> from django.utils.encoding import force_unicode
>>> force_unicode(lazy)
u'This field is required.'
>>> print force_unicode(lazy)
This field is required.

どうやら明示的に変換してやる必要があるみたい。 遅延評価の流れってのを少し理解出来たような気がする。

どうやるのが正しいのか?ってのをまだちゃんと理解出来てないので、 とりあえず force_unicode を使ってエラーを回避。

そのうちソースも追いかけてみよう。

Posted at: 
2007/11/02 01:43:11
0 Comments
0 TrackBacks
Tags: 
Django
Python
Trackback: 
http://humming.via-kitchen.com/2007/11/02/change-errormessage-to-ugettextlazy-on-django/trackback/

TrackBacks

まだ登録されていません。

Comments

まだ登録されていません。

Add Comment

Add Comment