Если я не выбираю файл и просто нажимаю «отправить», я получаю следующую ошибку: -
Invalid pstruct: {'upload': "b'' is not a FieldStorage instance"}
Это не то поведение, которое я получаю на демонстрационном сайте deform, где оставление его пустым приводит к более разумному ' Требуется' сообщение об ошибке.
Использование моего собственного валидатора, как показано ниже, не решает проблему: -
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 — это ValidationFailure
из 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
?