Djangoのエラーメッセージがugettext_lazyに。
ちょっと前から Django のtrunkを使うようになっているのですが、 r6520 から r6635 にアップデートしたらログイン部分がエラー吐いて動かなくなった。
ちょっと調べてみると、 r6625 で newforms のエラーメッセージが 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
- Trackback:
- http://humming.via-kitchen.com/2007/11/02/change-errormessage-to-ugettextlazy-on-django/trackback/
TrackBacks
まだ登録されていません。
Comments
まだ登録されていません。