经过一番搜索,我发现可以使用以下代码在web.py中实例化WTForms对象:
form = my_form(**web.input())
input()返回一个“类似字典”的web.storage对象,但是如果没有双星号,WTForms将引发一个异常:
TypeError: formdata should be a multidict-type wrapper that supports the 'getlist' method
从Python文档中我了解到,这两个星号用于解压命名参数字典。也就是说,我还是有点困惑到底是怎么回事。是什么使得web.input()返回的web.storage对象“类似于字典”的程度足以让它被**解包,而不是“类似于字典”的程度足以像传递给WTForms构造函数一样?
我知道这是一个非常基本的问题,但任何建议,以帮助一个新手程序员将非常感谢!
最佳答案
def process(self, formdata=None, obj=None, **kwargs):
if formdata is not None and not hasattr(formdata, 'getlist'):
if hasattr(formdata, 'getall'):
formdata = WebobInputWrapper(formdata)
else:
raise TypeError("formdata should be a multidict-type wrapper that supports the 'getlist' method")
for name, field, in iteritems(self._fields):
if obj is not None and hasattr(obj, name):
field.process(formdata, getattr(obj, name))
elif name in kwargs:
field.process(formdata, kwargs[name])
else:
field.process(formdata)
您当前将参数作为
**kwargs
传递,但是如果您希望formdata
工作,那么它应该是multidict类型,而不是常规的dict
或webpy的web.storage
,因为它们都没有getlist
方法。multidict
是为同一个键存储多个值的dict。您可以尝试将
web.input()
作为obj
参数传递,例如:form = my_form(None, web.input())
我认为它应该有效。关于python - 从web.py解压缩参数列表并实例化WTForms对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12172452/