【问题标题】:Wtforms, Multi selection file uploadWtforms,多选文件上传
【发布时间】:2014-07-05 13:28:15
【问题描述】:

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

我的表单:

    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>

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

如何做到这一点?

谢谢..

【问题讨论】:

    标签: python flask wtforms flask-wtforms


    【解决方案1】:

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

    form.pictures(multiple="")

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

    &lt;input id="pictures" multiple name="pictures" type="file"&gt;

    如何使用 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()
    

    【讨论】:

    • 这可以让你选择多个,但是对于像 request.files 这样的东西,你只能通过 WTF 获得一个密钥。您能否详细说明您是如何在后端进行操作的?
    • 我添加了一个来自旧项目的代码 sn-p 可能会回答您的问题。
    【解决方案2】:

    发件人:http://wtforms.readthedocs.org/en/latest/fields.html

    render_kw (dict) – 如果提供,提供默认值的字典 在渲染时将提供给小部件的关键字。

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

    forms.py

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

    上传模板.html

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2022-07-21
        • 2013-01-03
        • 1970-01-01
        • 1970-01-01
        • 2015-07-28
        • 2022-11-05
        • 2011-09-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多