如何使用默认文件创建WTForms FileField?

时间:2019-11-07 06:56:06

标签: flask wtforms

我想用FileField创建一个flask_wtf表单,但是我希望文件输入是默认的。 我该如何实现? 例如:

class InvoiceForm(FlaskForm):
    a = StringField()

对于这种形式,我可以直接创建为: 表格= InvoiceForm(a ='123')

对于类似的情况:

class InvoiceForm(FlaskForm):
    a = FileField()

我想使用默认文件字段来调用表单。 我该如何实现?

1 个答案:

答案 0 :(得分:1)

使用默认文件的文件路径,打开文件(具有扩展名),然后将文件对象分配给表单数据。

例如,如果您的表单FileField用于图像(例如.png,.jpg),则可以像往常一样创建表单域:

from flask_wtf.file import FileField, FileAllowed   

class InvoiceForm(Form):
  a = FileField(validators=[FileAllowed(['jpg', 'png'])])

然后在您的路线中,您可以从给定的文件路径中打开图像对象(请注意,我建议不要对文件路径进行硬编码,而应将其存储为环境变量)并将图像对象存储到表单中。数据:

from PIL import Image  # Used for opening image objects

@example.route('/', methods=['GET', 'POST']
def example():

  form = InvoiceForm()
  form.a.data = Image.open(default_file_path)
  # rest of route code below

请注意,当您在模板中查看表单时,文件表单字段仍将显示“未选择文件”,但是如果用户要提交表单,则文件表单字段将具有将要提交的默认图像对象。您可能可以使用一些JavaScript(请参见SO answer)为默认文件添加更好的UX。

我还建议您添加自己的表单验证,以限制文件的最大大小,可以上传的文件类型以及文件名验证,以将任何非固定文件路径转换为固定文件。有关详细信息,请参见Miguel Grinberg的Handling File Uploads With Flask