北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

SingleSelectFieldのoptionsの型は揃えましょう

新しいフレームワークの学習コストって大きいですねー。

最近本格的に触り始めた、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