Si je ne sélectionne pas un fichier et cliquez simplement sur « submit », je reçois l'erreur suivante: -déforment File Upload remplace mon message d'erreur avec pstruct non valide: non une instance FieldStorage
Invalid pstruct: {'upload': "b'' is not a FieldStorage instance"}
Ce n'est pas comportement que je reçois sur le deform demo site où le laisser vide entraîne le message d'erreur "Obligatoire" plus raisonnable.
En utilisant mon propre validateur comme ci-dessous ne résout pas le problème: -
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)
je peux voir que l'erreur est élevée, mais la sortie de e.render()
où e est le ValidationFailure
de form.validate
ne correspond pas à l'erreur lui-même. Le code source pertinent deform
est dans 'widget.py' où la classe _FieldStorage
vérifie si cstruct
a un attribut file
et déclenche sa propre exception Invalid
.
Voici la fonction qui fait l'appel de validation (stuff standard de bog), qui retourne la page rendue.
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
Comment puis-je montrer mon message d'erreur sans singe-patcher le deform
codebase?
Voir aussi: https://www.bountysource.com/issues/43000745-fileuploadwidget-raises-error-if-file -is-not-provided –