新しいフレームワークの学習コストって大きいですねー。
最近本格的に触り始めた、TurboGearsのselectのoptionで、
widgets.SingleSelectField( name='name', options=(('', u'選択してね'), (1, u'壱'), (2, u'弐'), (3, u'参')), ),
と定義してた箇所があります。ほとんどに関しては問題ないのですが、@validateさせて@error_handlerに処理が渡ったとこで問題が発生。フォームで選択したオプションが、エラー表示のフォームで反映されないのです。
原因は至って簡単。*1以下で直りました。
widgets.SingleSelectField( name='name', options=((0, u'選択してね'), (1, u'壱'), (2, u'弐'), (3, u'参')), ),
恐らく、以下のような要因が組合わさって起こってる気がします。
- @validateすると、ブラウザからの入力はunicodeではなくwidgets要素の型になる(っぽい)
- SingleSelectFieldでは型を決めるのに先頭のoptionの型しか見てない(っぽい)
- 修正前だとこのSingleSelectFieldはstringなので、ブラウザからの入力はstring、optionの値は数字なため、どのoptionにも一致せず選択されない
*1:わかるまでに1時間orz