FileRequiredValidator () не работает при использовании MultipleFileField () в моей форме - PullRequest
4 голосов
/ 14 января 2020

Мой класс UploadForm:

    from app import app
    from flask_wtf.file import FileRequired, FileAllowed
    from wtforms.fields import MultipleFileField
    from wtforms.validators import InputRequired,DataRequired
  class UploadForm(FlaskForm):
     .
     .
     .
     roomImage = MultipleFileField('Room',validators=[FileAllowed(['jpg', 'png'], 'Image only!'), FileRequired('File was empty!')] )
     .
     .
     .#there are other fields here which are  not relevant to  the problem at hand

HTML Шаблон

{% extends "base.html" %}

{% block content %}
 <h1>Upload Your Images</h1>
<form  action="/" enctype="multipart/form-data" method="post"  >
    {{ form.csrf_token }}
    Room<br />
    {{form.roomImage()}}
    .
    .
    . <MORE THINGS THAT I HAVE EDITED OUT>
    {{form.submit()}}
    <br/>
    {% if form.errors %}
      {{ form.errors }}
    {% endif %}
</form>
{% endblock %}

hosts.py для запуска проверки на проверку

def upload_image():#NEEDS HEAVY FIXING
    """home page to return the web page to upload documents"""
    form = UploadForm()
    if form.validate_on_submit():

Использование отладки VS Инструменты, я считаю, что form.validate_on_submit () не работает и всегда не проходит проверку, и я получаю эту ошибку на моей html странице.

{'roomImage': ['Файл был пуст! ']}

Существует еще один элемент управления MultipleFileField с почти таким же кодом. Эта проблема не возникает, когда я использую FileField для загрузки одного файла. Документация по этому вопросу очень ограничена, и все, что мне нужно было go, было это . Я действительно не знаю, как решить эту проблему. Я много искал, чтобы найти пример, включающий MultipleFileField, но они не используют никакой проверки. Поток на Github, который я больше не могу найти, предлагает использовать OptionalValidator, но тогда это не вариант для меня, и даже это не сработало. Может кто-нибудь предложить мне решение?

РЕДАКТИРОВАТЬ:

Даже валидатор FileAllowed () не работает.

Ответы [ 2 ]

1 голос
/ 28 января 2020

Это работает для меня (находится на GitHub "между строк"):

multi_file = MultipleFileField("Upload File(s)", validators=[DataRequired()])

Однако

FileAllowed(["xml", "jpg"])

игнорируется и не работает для меня.

РЕДАКТИРОВАТЬ: Нет, к сожалению, не работает ... Возвращает True для form.validate() и form.validate_on_submit(), но когда вы не передаете файлы, удалив

required=""

from

<input id="multi_file" multiple="" name="multi_file" required="" type="file">

и отправьте форму, она все равно оценивается как True.

Таким образом, проблема по-прежнему сохраняется в полном объеме, как описано ...

0 голосов
/ 16 января 2020

Этот подход, кажется, решает одну часть проблемы и использует j-запрос, с которым я был незнаком до этого момента. Так как я новичок, когда дело доходит до веб-разработчика, я искал подход, основанный на python. Я не думаю, что это только что существует. Будет обновляться, когда я исправлю проблему загрузки нескольких файлов. Jsfiddle link

jQuery.validator.setDefaults({
  debug: true,
  success: "valid"
});
$( "#myform" ).validate({
  rules: {
    ":file": {
      required: true,
      accept: "image/*"
    }
  }
});

и

<form id="myform">
<label for="field">Required, image files only: </label>
<input type="file" class="left" id="field" name="field" multiple>
<br/>
<input type="submit" value="Validate!">
</form>
<script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/jquery.validation/1.16.0/jquery.validate.min.js"></script>
<script src="https://cdn.jsdelivr.net/jquery.validation/1.16.0/additional-methods.min.js"></script>

Поскольку я использовал wtforms, я попробовал нечто, называемое классом валидации и встроенными валидаторами, которые, кажется, делают свое дело.

 """
Validation Class for RoomUpload
"""
class MyRoomValidator(object):
    def __init__(self, message=None):
        if not message:
            message = u"You need to upload the images with the category as well"
        self.message = message

    def __call__(self, form, field):
        print(len(form.roomImage.data))
        print((form.roomTypeSelect.data))
        if (not form.roomImage.data and  form.roomTypeSelect.data == -1) or(form.roomImage.data and  form.roomTypeSelect.data == -1) or (not form.roomImage.data and  form.roomTypeSelect.data != -1):#check for all possible combinations
            raise ValidationError(self.message)

class RoomUpload(FlaskForm):
    """
    This is meant for the sub-form for room details upload
    containing the details for room and its subtype

    roomImage:Upload the room image
    roomTypeSelect:The subcategory for room category

    The Form will only be submitted if the images  are uploaded and
    the RoomType will be selected
    """
    def validate_roomTypeSelect(form, field):#Inline Validator to ensure if default choice is not chosen
       print(field.data)
       if field.data == -1:
            raise ValidationError('Need to Select Room Type')
    def validate_roomImage(form,field):
        for roomFile in field.data:
            print(roomFile.filename)
            if  isanImageFile(roomFile.filename) == False: 
                raise ValidationError("Error!!! Not an Image File ")
    roomImage = MultipleFileField(u"Room",validators=[MyRoomValidator(),FileAllowed],id = "roomImage")
    roomTypeSelect= SelectField("Room Type",choices=roomTypes,coerce=int,id="roomTypeSelect")
    roomSubmit = SubmitField("Upload the images  of the room")
...