如果我没有选择文件而只是单击“提交”,我会收到以下错误:-
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 ValidationFailure
from的输出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
?