我有一个cgi脚本,其中包含一个选择框,最终用户可以提交多个选项或只提供一个选项。此选择标记名为“参数”。请看这里的例子......
http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_select_multiple
当提交此表单并选择了多个选项时,URL看起来像这样...
http ........ mycgiscript.py?parameters=option1value¶meters=option2values
或者如果用户只选择了一个选项,它就像这样......
HTTP ........ mycgiscript.py?parameters=option3value
我的表单被声明为......
import cgi
form = cgi.FieldStorage()
因此,当用户选择多个选项并提交表单时,表单['parameters']的数据类型是一个列表,但是,当用户只选择一个选项并提交时,表单['parameters'的数据类型]是一个实例...
多个选项(以列表形式返回):
[MiniFieldStorage('parameters', 'option1value'), MiniFieldStorage('parameters', 'option2value')]
单一选项(以实例形式返回):
MiniFieldStorage('parameters', 'option3value')
我的问题是......
因为表单['parameters']可以是列表或实例,具体取决于用户提交的内容;处理这两种数据类型的最佳方法是什么?我想要的输出是一个列表变量,包含在表单上选择的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 guru能够提出一个更好的方法来做到这一点。
答案 0 :(得分:4)
你可以做的是使用:
form.getlist( '参数')
这提供了具有相同名称的所有不同输入类型的值,即参数。
这是我在20.2.2中从http://docs.python.org/2/library/cgi.html收集的内容,他们建议在您预期可能有多个具有相同名称字段的项目时就是这种情况。
希望这有帮助,虽然我认为你自己已经找到了这个。