Python FileRequiredValidator()不';在我的表单中使用multipleField()时不起作用

Python FileRequiredValidator()不';在我的表单中使用multipleField()时不起作用,python,python-3.x,validation,flask,wtforms,Python,Python 3.x,Validation,Flask,Wtforms,我的上传表单类: 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): . .

我的上传表单类:

    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 %}
使用VS的调试工具,我发现表单.validate\u on_submit()不起作用,并且总是无法通过验证,我在html页面上遇到了这个错误

{'roomImage':['文件为空!']}

还有另一个多场控制几乎完全相同的代码。 当我使用FileField上载一个文件时,不会发生此问题。关于这方面的文档非常有限,我所要做的就是。我真的不知道如何解决这个问题。我已经搜索了大量涉及multipleField的示例,但它们没有使用任何验证。Github上的一个线程我再也找不到了,它建议使用OptionalValidator,但这对我来说不是一个选项,即使这样也不起作用。 有人能给我一个解决方案吗

编辑: 甚至FileAllowed()验证器似乎也不起作用。

方法似乎解决了问题的一部分,它使用了j-query,直到现在我还不熟悉j-query。 所以,因为我是web开发的新手,所以我一直在寻找一种基于python的方法来实现这一点。我认为它还不存在。 将在修复多文件上载问题时更新。 JSFIDLE

这对我来说很有用(在GitHub的“字里行间”中找到):

然而

FileAllowed(["xml", "jpg"])
被忽略,对我不起作用

编辑: 不,很遗憾,它不起作用。。。对于
form.validate()
form.validate\u on\u submit()
,它返回True,但是当您没有传递任何文件时,通过删除

required=""


并提交一份表格,它仍然认为这是真的


所以问题仍然存在,正如所述…

关于FileAllowed validator,它不起作用,因为FileAllowed validator需要一个FileStorage对象,但MultipleFileField正在发送一个FileStorage对象列表,这就是它不起作用的原因。您必须自己实现允许的多文件验证程序。有关更多详细信息,请参见

在他们的GitHub项目上创建了一个问题。我创建了一个自定义的验证类,对我来说效果很好。至于FileAllowed,我使用它只是因为Github上的线程提到了它。它不是我的用例所需要的。我的用例是执行上传文件的验证。
<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>
 """
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")
multi_file = MultipleFileField("Upload File(s)", validators=[DataRequired()])
FileAllowed(["xml", "jpg"])
required=""
<input id="multi_file" multiple="" name="multi_file" required="" type="file">