Nếu tôi không chọn một tập tin và chỉ cần nhấp vào 'submit', tôi nhận được lỗi sau: -biến dạng File Upload ghi đè thông báo lỗi của tôi với pstruct không hợp lệ: không phải là một ví dụ FieldStorage
Invalid pstruct: {'upload': "b'' is not a FieldStorage instance"}
Đây không phải là hành vi tôi nhận được trên deform demo site nơi để trống kết quả trong thông báo lỗi 'Bắt buộc' hợp lý hơn.
dùng validator của riêng tôi như dưới đây không giải quyết vấn đề này: -
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)
tôi có thể thấy rằng các lỗi được nâng lên, nhưng đầu ra của e.render()
trong đó e là ValidationFailure
từ form.validate
không phù hợp với lỗi chinh no. Mã nguồn deform
có liên quan nằm trong 'widget.py', trong đó lớp _FieldStorage
kiểm tra xem cstruct
có thuộc tính file
và tăng ngoại lệ Invalid
riêng của nó hay không.
Đây là chức năng thực hiện cuộc gọi xác thực (thực tế là chuẩn bog), trả về trang được hiển thị.
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
Làm cách nào để hiển thị thông báo lỗi của riêng tôi mà không cần vá mã vạch deform
?
Xem thêm: https://www.bountysource.com/issues/43000745-fileuploadwidget-raises-error-if-file không được cung cấp –