1

エンド ユーザーが複数のオプションまたは 1 つのオプションのみを送信できる選択ボックスを含む cgi スクリプトがあります。この選択タグの名前は「パラメーター」です。例については、こちらを参照してください....

http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_select_multiple

複数のオプションを選択してこのフォームを送信すると、URL は次のようになります...

http........mycgiscript.py?parameters=option1value¶meters=option2values

または、ユーザーが 1 つのオプションのみを選択した場合は、次のようになります...

http........mycgiscript.py?parameters=option3value

私のフォームは次のように宣言されています...

import cgi
form = cgi.FieldStorage()

したがって、ユーザーが複数のオプションを選択してフォームを送信する場合、form['parameters'] のデータ型はリストですが、ユーザーが 1 つのオプションのみを選択して送信する場合、form['parameters'] のデータ型はリストです。実例...

複数のオプション (リストとして返されます):

[MiniFieldStorage('parameters', 'option1value'), MiniFieldStorage('parameters', 'option2value')] 

単一オプション (インスタンスとして返される):

MiniFieldStorage('parameters', 'option3value') 

私の質問は....

form['parameters'] は、ユーザーが送信する内容に応じてリストまたはインスタンスになる可能性があるため。これら 2 つのデータ型を処理する最良の方法は何ですか? 必要な出力は、フォームで選択された optionsXvalues を含むリスト変数です。これまでのところ、私ができる最善のことは...

if type(form['parameters']) == type([]):
    l = [ x.value for x in form['parameters'] ]
else:
    l = [form['parameters'].value]

ユーザーが複数のオプションを選択すると、単純に form['parameters'].value を使用すると次の例外が発生するため、このようにしました。

AttributeError: 'list' object has no attribute 'value'

上記の if/else ステートメントに基づく提案よりも良い方法はありますか? Python の第一人者の何人かが、これを行うためのより良い方法を提案できることを期待していました。

4

1 に答える 1

4

あなたができることは使用することです:

form.getlist('パラメータ')

これにより、同じ名前、つまりパラメーターを持つすべての異なる入力タイプの値が提供されます。

これは、20.2.2 のhttp://docs.python.org/2/library/cgi.htmlから収集したもので、同じ名前フィールドを持つ複数のアイテムが存在する可能性があると予想される場合に当てはまると示唆されています。

これが役立つことを願っていますが、あなたはすでにこれを自分で見つけたと思います。

于 2013-05-02T20:40:05.973 に答える