Wtforms,多选文件上传

时间:2014-05-17 00:23:14

标签: python flask wtforms flask-wtforms

我有一个包含姓名和图片的表单

MyForm的:

    name = TextField(
    u'name',
    validators=[
        validators.DataRequired(),
        validators.Length(min=1, max=25)
    ]
)   

    pictures = FileField(
    u'pictures',
    validators=[
        FileRequired(),
        FileAllowed(['jpg', 'png'], 'Images only!')
    ]
)

Jinja2模板:

{% from "_form_helpers.tpl" import render_field %}
<form method="post" action="" enctype="multipart/form-data">
  <dl>
    {{ render_field(form.name) }}
    {{ render_field(form.pictures) }}
  </dl>
  <p>{{ form.submit }}
</form>

我想在一个字段中上传一张或多张图片(多选)。

怎么做?

谢谢..

3 个答案:

答案 0 :(得分:6)

您需要为输入标记指定multiple属性。这可以在您的模板中完成,如下所示:

form.pictures(multiple="")

这将导致您生成的html允许多个文件选择:

<input id="pictures" multiple name="pictures" type="file">

如何使用request.files操作多个文件:

    images = request.files.getlist("pictures")
    if images:
        for img in images:
            # Create Images
            file_name = str(uuid.uuid4()) + secure_filename(img.filename)
            image_file = os.path.join(app.config['UPLOAD_FOLDER'], file_name)
            img.save(image_file)

            # Save record
            image = models.Image(record_id=record.record_id,
                                 file_name=file_name.encode('utf-8'))
            db.session.add(image)

    db.session.commit()

答案 1 :(得分:4)

来自:http://wtforms.readthedocs.org/en/latest/fields.html

  

render_kw (字典) - 如果提供,则提供默认的字典   将在渲染时提供给窗口小部件的关键字。

因此,您可以将{multiple: True}传递给字段定义,如下所示:

<强> forms.py

class UploadImages(Form):

    imgs = FileField(
        'Select images',
        render_kw={'multiple': True},
    )
    upload = SubmitField('Upload')

<强> uploade_template.html

{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}

答案 2 :(得分:1)

自2.2版以来,wtforms支持MultipleFileField。 (摘自https://wtforms.readthedocs.io/en/stable/changes.html#version-2-2