经过一番搜索,我发现可以使用以下代码在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构造函数一样?
我知道这是一个非常基本的问题,但任何建议,以帮助一个新手程序员将非常感谢!

最佳答案

WTForms source

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/

10-12 07:32