6

如果我没有选择文件而只是单击“提交”,我会收到以下错误:-

Invalid pstruct: {'upload': "b'' is not a FieldStorage instance"}

这不是我在变形演示站点上得到的行为,将其留空会导致更合理的“必需”错误消息。

如下使用我自己的验证器并不能解决问题:-

def validate_file(node, value, **kwargs):
    if not value:
        raise colander.Invalid(node, "Please select a file")

class Schema(colander.MappingSchema):
    excel_file = colander.SchemaNode(deform.FileData(),
            widget=deform.widget.FileUploadWidget(tmpstore),
            validator=validate_file)

我可以看到引发了错误,但是e.render()其中 e is the ValidationFailurefrom的输出form.validate与错误本身不匹配。相关的deform源代码在“widget.py”中,_FieldStorage该类检查是否cstruct具有file属性并引发它自己的Invalid异常。

这是执行验证调用的函数(实际上是标准的东西),它返回呈现的页面。

def generate_upload_form(request):
    form = deform.Form(upload_schema, buttons=('submit',))
    if getattr(request, 'POST') and 'submit' in request.POST:
        try:
            value_dict = form.validate(request.POST.items())
        except deform.ValidationFailure as e:  # Invalid form
            form = e.render()
        else:  # Successfully validated, now do operation
            upload_form_operation(request, value_dict)
    if isinstance(form, deform.Form):
        form = form.render()
    return form

如何在不对代码库进行猴子修补的情况下显示我自己的错误消息deform

4

1 回答 1

1

您确定您确实正确提交了表单数据吗?当变形尝试通过鸭子类型反序列化提交的值时,通常会发生此错误。

一个被忽略的特定项目是确保您的 HTML 表单具有附加的 enctype 定义,例如

 enctype="multipart/form-data"

没有这个,表单将文件名作为字符串提交,然后将失败

于 2017-03-21T18:43:28.917 回答