2016-06-06 14 views
1

Ich versuche die Email und Telefonnummer in meinem Formular zu bestätigen. Dies geschieht, aber wenn dieser Validierungsfehler aufgetreten ist, kann das Dateifeld die hochgeladene Datei nicht enthalten. Meine Form ist unten angegeben.Dateifeld kann die Datei nicht halten, wenn ein anderer Validierungsfehler in wtforms aufgetreten ist

forms.py

from wtforms import Form ,SelectField,StringField, validators , IntegerField , DateField , SelectMultipleField , FileField ,widgets 

from wtforms.validators import StopValidation, ValidationError 

def customvalidatorForAdImage(form, field): 
       allowed_file = ['jpg','jpeg','png','gif'] 
       if form.image.data: 
        if form.image.data.split('.',1)[1] not in allowed_file: 
         raise ValidationError("Please enter a valid image file")  
class CreateAdForm(Form): 
      ad_name = StringField("Ad Name", [validators.DataRequired("Ad name is required")]) 
      advertiser_name =SelectField("Advertiser Name" , coerce=int) 
      ad_type = SelectField("Ad Type" , choices =zip(ad_type_categories , ad_type_cat_lebels)) 
      image = FileField("Image" , [customvalidatorForAdImage, validators.DataRequired("Image is required")]) 
      url = StringField("URL" , [validators.DataRequired("URL is required")]) 
      contact_name = StringField("Contact Name" , [validators.DataRequired("Contact Name is required")]) 
      contact_email = StringField("Contact Email" , [validators.DataRequired("Contact Email is required"), validators.Email("Please enter a valid email")]) 
      contact_phone = StringField("Contact Phone" , [validators.DataRequired("Contact Phone is required"), validators.Regexp("^(\+\d{1,3}[- ]?)?\d{10}$", message="Please enter a valid phone number")]) 
      status = SelectField("Status" , choices = zip(status_categories , status_cat_lebles))  

Und meine ad.html Datei ist unten angegeben:

ad.html

{% extends "base.html" %} 
{% set title = "Admin Manage Advertisers" %} 
{% block head_css %} 

{% endblock %} 
{% block main_body %} 
<div class="container"> 
    <div class="row"> 
     <div class="col-sm-8 col-sm-offset-2"> 
      {% if err_msg %} 
      <div class="alert alert-danger alert-msg-with-icon" role="alert"> 
      <i class="icon-exclamation-sign" style="font-size:60px;color:#B94A48;"></i> 
      <p>{{err_msg}}<br> If you believe this message is in error, please reach out to <a href='mailto:[email protected]' class="alert-link">[email protected]</a></p> 
      </div> 
      {% endif %} 
      <h1 class="text-center"><strong>Create a New Ad</strong></h1> 
      <form action="/create-ad" enctype="multipart/form-data" method="POST"> 
       <div class="form-group"> 
       {{ ad_form.ad_name.label }} 
       {{ ad_form.ad_name(class_="form-control", **{"data-parsley-required":"true", 
                  "data-parsley-required-message":"Ad name is required"}) }} 

       <span class="help-block"></span> 
       </div> 
      <div class="row"> 
       <div class="col-md-5"> 
       <div class="form-group" > 
       {{ ad_form.advertiser_name.label }} 
       {{ ad_form.advertiser_name(class_="form-control" , **{"data-parsley-required":"true", 
                  "data-parsley-required-message":"Advertiser name is required"}) }} 


       <span class="help-block"></span> 
       </div> 
       </div> 
       <div class="col-md-5 col-md-offset-2"> 
       <div class="form-group" > 
       {{ ad_form.ad_type.label }} 
       {{ ad_form.ad_type(class_="form-control", **{"data-parsley-required":"true", 
                  "data-parsley-required-message":"Ad type is required" 
                  }) }} 
       <span class="help-block"></span> 
       </div> 
       </div> 
       </div> 
       <div class="row"> 
       <div class="col-md-5"> 
       <div class="form-group {{ 'has-error' if ad_form.image.errors}}"> 
       {{ ad_form.image.label }} 
       {{ ad_form.image(**{"data-parsley-required":"true", 
                  "data-parsley-required-message":"Image is required", 

                  }) }} 
       <span class="help-block">{{ ad_form.image.errors[0] if ad_form.image.errors }}</span> 
       </div> 
       </div> 
      <div class="col-md-5 col-md-offset-2"> 
       <div class="form-group" > 
       {{ ad_form.status.label }} 
       {{ ad_form.status(class_="form-control", **{"data-parsley-required":"true", 
                  "data-parsley-required-message":"Status is required" 
                  }) }} 
       <span class="help-block"></span> 
       </div> 
       </div> 
       </div> 
       <div class="form-group" > 
       {{ ad_form.url.label }} 
       {{ ad_form.url(class_="form-control", **{"data-parsley-required":"true", 
                  "data-parsley-required-message":"URL is required" 
                  }) }} 
       <span class="help-block"></span> 
       </div> 
       <div class="form-group"> 
       {{ ad_form.contact_name.label }} 
       {{ ad_form.contact_name(class_="form-control", **{"data-parsley-required":"true", 
                  "data-parsley-required-message":"Contact Name is required" 
                  }) }} 
       <span class="help-block"></span> 
       </div> 
       <div class="form-group {{ 'has-error' if ad_form.contact_email.errors}}" > 
       {{ ad_form.contact_email.label }} 
       {{ ad_form.contact_email(class_="form-control", **{"data-parsley-required":"true", 
                  "data-parsley-required-message":"Contact Email is required" 
                  }) }} 
       <span class="help-block">{{ ad_form.contact_email.errors[0] if ad_form.contact_email.errors }}</span> 
       </div> 
       <div class="form-group {{ 'has-error' if ad_form.contact_phone.errors}}" > 
       {{ ad_form.contact_phone.label }} 
       {{ ad_form.contact_phone(class_="form-control", **{"data-parsley-required":"true", 
                  "data-parsley-required-message":"Contact Phone is required" 
                  }) }} 
       <span class="help-block">{{ ad_form.contact_phone.errors[0] if ad_form.contact_phone.errors }}</span> 
       </div> 

       <button type="submit" class="btn btn-primary btn-block">SUBMIT</button> 
      </form> 
     </div> 
    </div> 
</div> 
{% endblock %} 
{% block contact_us_block %} 
{% endblock %} 
{% block js_block %} 
{{super()}} 

<script> 
$(document).ready(function(){ 

    $("div.container form").parsley({ 
     successClass: "", 
     errorClass: "has-error", 
     classHandler: function(el) { 
      return el.$element.closest(".form-group"); 
     }, 
     errorsWrapper: "<span class='help-block'></span>", 
     errorTemplate: "<span></span>" 
    }); 

}) 
</script> 
{% endblock %} 

Und sehen Sie den Bildschirm-shot vor Form submit.Here I habe eine Bilddatei und eine ungültige E-Mail ausgewählt. enter image description here

Aber wenn ich auf den Absenden-Button klicke, wird der E-Mail-Validierungsfehler angezeigt, aber die ausgewählte Bilddatei kann nicht gespeichert werden. Wie kann ich das beheben? Sehen Sie sich den Screenshot nach dem Senden an. Es zeigte "Keine Datei ausgewählt" im Dateifeld an, aber ich habe die Datei bereits ausgewählt. Vielen Dank. enter image description here

Antwort

1

Es ist eine Funktion von HTML, Sie können nicht einfach umgehen. Wenn der Server könnte senden Sie eine HTML-Seite an den Client mit ein wenig zusätzliche Informationen sagen "Hey, Sie haben versucht, REALLY_SECRET_FILE, bitte automatisch erneut anhängen Sie bitte" Sie könnte leicht vorstellen, dass es für schlechte Zwecke verwendet wird (vor allem seit Sie könnten das Dateifeld mit CSS verstecken).

So haben Sie zwei verbleibende Optionen, die in den Sinn kommen - Sie sagen, das Formular wurde nicht validiert, aber Sie können optional nur das Dateifeld zuerst validieren, dann auf dem Server speichern, dann wenn das verbleibende Formular Bei fehlgeschlagener Validierung können Sie das Formularfeld aus dem vorgefüllten Formularfeld entfernen, das Sie an den Client senden, und es beispielsweise durch eine Miniaturansicht der bereits hochgeladenen Datei ersetzen. Die andere Option besteht darin, sich stärker auf die Client-Seite des Prozesses zu konzentrieren - mehr clientseitige Validierung durchzuführen, um die Wahrscheinlichkeit zu reduzieren, dass ein Formular jemals eingereicht wird, aber die Validierung auf dem Server trotzdem noch fehlschlägt -Seite, um seltsame oder ungezogene Situationen einzufangen.

Verwandte Themen