【问题标题】:FileRequiredValidator() doesn't work when using MultipleFileField() in my form在我的表单中使用 MultipleFileField() 时,FileRequiredValidator() 不起作用
【发布时间】:2020-05-01 05:00:21
【问题描述】:

我的 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 上传一个文件时,不会发生此问题。这方面的文档非常有限,我只需要继续阅读this。我真的不知道如何解决这个问题。我已经广泛搜索以查找涉及 MultipleFileField 的示例,但它们没有使用任何验证。我在 Github 上找不到的一个线程建议使用 OptionalValidator,但这对我来说不是一个选项,甚至没有用。 有人可以建议我一个解决方案吗?

编辑:

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

【问题讨论】:

    标签: python python-3.x validation flask wtforms


    【解决方案1】:

    这对我有用(在 GitHub 上“字里行间”找到):

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

    然而

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

    被忽略,对我不起作用。

    编辑: 不,很遗憾,它不起作用...它为 form.validate()form.validate_on_submit() 返回 True,但是当您不传递任何文件时,通过删除

    required=""
    

    来自

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

    并提交一个表单,它仍然将其评估为 True。

    所以问题仍然存在,如前所述......

    【讨论】:

    【解决方案2】:

    关于 FileAllowed 验证器,它不起作用,因为 FileAllowed 验证器需要一个 FileStorage 对象,但 MultipleFileField 正在发送一个 FileStorage 对象列表,这就是它不起作用的原因。您必须自己实现 MultiFileAllowed 验证器。更多详情StackOverflow answer explained with example.

    【讨论】:

    • 我创建了一个自定义验证类,对我来说效果很好。
    • 至于 FileAllowed,我只使用过它,因为 Github 上的线程已经提到它。这不是我的用例所需要的。我的用例是对正在上传的文件进行验证。
    【解决方案3】:

    This 方法似乎解决了问题的一部分,它使用 j-query,直到这一点我还不熟悉。 因此,由于我是 web-dev 的新手,所以我一直在寻找一种基于 python 的方法。我认为它还不存在。 当我修复多文件上传问题时会更新。 jsfiddlelink

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-22
      • 2015-03-10
      • 1970-01-01
      • 2016-07-13
      • 2017-12-29
      • 1970-01-01
      • 2017-02-25
      • 2018-10-25
      相关资源
      最近更新 更多