チェックボックスで送信した複数の値をPythonで受け取ろうとした時に少しハマったので正しい取得方法について記します。
Python側でのフォーム取得にはFieldStorageを使用しています。
※Pythonのバージョンは3.6
うまく動かない例
PHPなどになれているとやってしまいやすい間違いだと思うのですが、下記のように書くとうまく動きません。
原因はPython側ではなく、HTML側にあります。
PHPでチェックボックスなどの値を送信する場合は、name=”fruits[]” のように [] を付けるのですが、PythonのFieldStorageでは []があるとうまく受け取れないようです。
<form action="post.py">
<input type="checkbox" name="fruits[]" value="apple"> <!-- ここが問題 -->
<input type="checkbox" name="fruits[]" value="orange"> <!-- ここが問題 -->
</form>
import cgi
form = cgi.FieldStorage()
fruits= form.getvalue('fruits')
うまく動く例
上記で述べたようにPythonのFieldStorageで取得する際はHTMLフォームのnameに [] は必要ないので、そこだけ修正すれば動くようになります。
<form action="post.py">
<input type="checkbox" name="fruits" value="apple"> <!-- 修正 -->
<input type="checkbox" name="fruits" value="orange"> <!-- 修正 -->
</form>
import cgi
form = cgi.FieldStorage()
fruits= form.getvalue('fruits')
複数の値を取得する時のgetvalue()の問題点
複数の値を取得する時にgetvalue()を使うと一つ問題点があります。
それは値が一つの時と二つ以上の時で返り値の型が変わってしまう事です。
これでは取得したい値をfor文などで回したい時に困ってしまいます。
#値が一つの場合
fruits= form.getvalue('fruits')
pritn(type(fruits)) #<class 'str'>
#値が二つ以上の場合
fruits= form.getvalue('fruits')
pritn(type(fruits)) #<class 'list'>
Pythonでの複数の値取得にはgetlist()
PythonのFieldStorageでの複数の値の取得にはgetlist()を使うのがベストプラクティスのように思われます。
getlist()を使うと下記のように値が一つでも複数でもlist型で返してくれます。
#値が一つの場合
fruits= form.getvalue('fruits')
pritn(type(fruits)) #<class 'list'>
#値が二つ以上の場合
fruits= form.getvalue('fruits')
pritn(type(fruits)) #<class 'list'>
以上、Pythonのフォーム送信で複数の値を取得する方法でした。
コメント