2017-03-13 5 views
6

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?

+0

Voir aussi: https://www.bountysource.com/issues/43000745-fileuploadwidget-raises-error-if-file -is-not-provided –

Répondre

1

Etes-vous sûr de recevoir correctement les données du formulaire? Cette erreur se produit généralement lorsque la déformation tente de désérialiser la valeur soumise via la frappe du canard.

Un élément particulier qui est ignoré est de s'assurer que votre formulaire HTML a l'enctype supplémentaire défini par exemple.

enctype="multipart/form-data" 

Sans cette forme soumet le nom de fichier comme une chaîne qui ensuite ne

+0

Cela peut très bien l'être (n'ayant pas accès au système pour le moment) mais je ne suis pas en train de définir le formulaire en html, en utilisant simplement le html directement à partir de form.render(). Cela rendrait-il un bug (en supposant que ce soit le problème réel)? –

+0

Après avoir vérifié le système, le formulaire enctype est en effet multipart/form-data, donc ce n'est pas la source du problème. –

+0

@ NgOon-Ee Je pense que j'ai besoin de voir un peu plus de code. Est-il possible de voir comment vous validez et gérez l'exception levée, s'il vous plaît? –