以前、h.selectを使用してselectタグを生成する方法を
紹介しましたが、selectタグ内のoptionタグはベタに
書かないといけませんでした。
optionタグをリストから生成するには
h.options_for_selectを使用します。
h.selectと組み合わせて
${h.select('select_test', h.options_for_select(["VISA", "MasterCard"]))}
これで
<select id="select_test" name="select_test">
<option value="VISA">VISA</option>
<option value="MasterCard">MasterCard</option>
</select>
こんな感じのHTMLが出力されます。
値と表示する文字を変更したい場合は、リストの中にリストを入れるか、
辞書を渡せばよい模様
${h.select('select_test', h.options_for_select([["Dollar", "$"], ["Kroner", "DKK"]]))}
${h.select('select_test', h.options_for_select(dict(Basic="$20", Plus="$40")))}
初期選択状態にする値を指定したい場合は
${h.select('select_test', h.options_for_select(["VISA", "MasterCard"], "MasterCard"))}
初期表示させたい項目を第二引数に指定すればOKです。
複数選択のリストで複数初期表示の状態を変更したい場合は、
${h.select('select_test', h.options_for_select(["VISA", "MasterCard", "Discover"], ["VISA", "Discover"]),multiple=True)}
こんな感じで、選択させたい項目のリストを渡します。
オブジェクトの入ったリストからoptionタグを
生成する方法です。
<%
class Clazz:
def __init__(self,name,attr):
self.name = name
self.attr = attr
l = [Clazz('test1', 'attr1'), Clazz('test2', 'attr2'), Clazz('test3', 'attr3')]
%>
<select>
${h.options_for_select_from_objects(l, 'name', value_attr='attr', selected='attr3')}
</select>
第一引数にリスト、第二引数にプロパティ名を渡します。
その他に
・valueに指定するプロパティ
value_attr='attr'
・初期表示する項目
selected='attr3'
これは便利。
もう一つ、辞書を引数に指定する方法です。
<% l = [{'title':'title1','attr':'attr1'},{'title':'title2','attr':'attr2'}] %>
${h.options_for_select_from_dicts(l, "title", value_key='attr', selected='attr2')}
第一引数にリスト、第二引数に表示する文字列のキーを指定します。
また
・valueに指定するプロパティ
value_key='attr'
・初期表示する項目
selected='attr2'
の指定が行えます。