2016-06-06 8 views
1

Я пытаюсь проверить адрес электронной почты и номер телефона в моей форме. Это делается, но когда эта ошибка проверки произошла, поле файла не может содержать загруженный файл. Моя форма приведена ниже.Поле файла не может содержать файл, если в wtforms произошла другая ошибка проверки.

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))  

И мой файл ad.html приводится ниже:

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 %} 

И увидеть снимок экрана, прежде чем форма submit.Here I выбрали файл изображения и недействительный адрес электронной почты. enter image description here

Но когда я нажимаю кнопку отправки, отображается ошибка проверки электронной почты, но не может удерживать выбранный файл изображения. Как я могу это исправить? См. Экранный снимок после отправки. Он отобразил «Файл не выбран» в поле файла, но я уже выбрал этот файл. Благодарю. enter image description here

ответ

1

Это особенность HTML, вы не можете легко обойти ее. Если сервер может отправить клиенту html-страницу с небольшой дополнительной информацией, говорящей «» «Эй, вы пытались загрузить REALLY_SECRET_FILE, пожалуйста, автоматически прикрепите его, пожалуйста,« », вы можете легко представить, что это используется для плохих целей (тем более, что вы можете скрыть поле файла с помощью CSS).

Итак, у вас есть две оставшиеся опции, которые вам приходят в голову - вы говорите, что форма не подтвердилась, но вы можете при необходимости просто проверить поле файла сначала, а затем сохранить это на сервере, затем , если остальная форма не удалось проверить, вы можете удалить поле формы из поля заполненной формы, которое вы отправляете обратно клиенту, и заменить его, скажем, миниатюром уже загруженного файла.

Другой вариант заключается в том, чтобы опираться на клиентскую сторону процесса - выполнять дополнительную проверку на стороне клиента, чтобы уменьшить вероятность когда-либо представленной формы, которая не прошла проверку, но, конечно же, все еще проверяет на сервере - чтобы уловить нечетные или озорные ситуации.