python - Flask WTF表单文件上传:当上传表单继承自另一个表单时,FileRequired() 验证失败,即使文件存在
问题描述
我有一个收集一些信息的表单,以及一个允许用户上传文件的表单。这些都有效。现在我正在尝试制作一个将它们结合起来并从两者继承的表单。
我的文件上传表单有一个 FileRequired() 验证器。当我只访问上传表单时,这很好。如果我有我的组合表单尝试继承上传表单,验证将失败。但是,如果我删除 FileRequired() 验证器,或者通过从它继承的表单中删除它,或者通过替换组合表单上的该字段,文件上传正常。只有验证失败,而不是文件上传。我可以通过其他方式进行验证(检查 的长度request.files.getlist('<file>')
,实际上已经在检查以防止用户上传太多文件,所以我有一个解决方法,但我想了解为什么会失败。
这是我的views.py:
def add_scan(request, exp_id):
"""Add a scan"""
user_id = str(current_user.get_id())
if len(request.files.getlist('scan_file')) > 3:
flash('You can upload up to three files.', 'warning')
return redirect(url_for('scan.add'))
for f in request.files.getlist('scan_file'):
ScanService(user_id, exp_id).add(f)
flash('You successfully added a new scan.', 'success')
return redirect(url_for('experiment.experiments'))
@blueprint.route('/add', methods=['GET', 'POST'])
def add():
"""Access the add scan route and form."""
form = ScanForm()
if form.validate_on_submit():
exp_id = str(session['curr_experiment'])
return add_scan(request, exp_id)
else:
flash_errors(form)
return render_template('scans/upload.html',scan_form=form)
@blueprint.route('/add_experiment_and_scans', methods=['GET', 'POST'])
def add_experiment_and_scans():
"""Acess the add experiment and scans route and form"""
form = ExperimentAndScanForm(request.form)
if form.validate_on_submit():
exp_id = add_experiment(form)
return add_scan(request, exp_id)
else:
flash_errors(form)
return render_template('scans/experiment_and_scans.html', experiment_and_scan_form=form)
以下是表格:
class ExperimentForm(FlaskForm):
"""Experiment form."""
date = DateField('Date')
scanner = SelectField('Scanner', choices=[('GE', 'GE'), ('Sie', 'Siemens'), ('Phi', 'Phillips')])
field_strength = SelectField('FieldStrength', choices=[('1.5T', '1.5T'), ('3T', '3T'), ('7T', '7T')])
def __init__(self, *args, **kwargs):
"""Create instance."""
super(ExperimentForm, self).__init__(*args, **kwargs)
class ScanForm(FlaskForm):
scan_file = FileField(validators=[FileAllowed(['nii', 'nii.gz', 'zip']), FileRequired()])
submit = SubmitField('Submit')
def __init__(self, *args, **kwargs):
"""Create instance."""
super(ScanForm, self).__init__(*args, **kwargs)
class ExperimentAndScanForm(ExperimentForm, ScanForm):
def __init__(self, *args, **kwargs):
"""Create instance."""
super(ExperimentAndScanForm, self).__init__(*args, **kwargs)
验证成功,但ScanForm
失败FileRequired()
。ExperimentAndScanForm
删除(通过从 ScanForm 中删除或替换 中的FileRequired()
属性)允许文件上传。在with中创建新属性会导致验证失败。 ExperimentAndScanForm
scan_file
ExperimentAndScanForm
scan_file
ExperimentAndScanForm
FileRequired()
我不确定它是否有帮助,但这里是呈现此表单的模板:
<form method="POST" action="{{ url_for('scan.add_experiment_and_scans') }}" enctype="multipart/form-data">
<div class="form-group">
{{experiment_and_scan_form.date.label}}
{{experiment_and_scan_form.date(placeholder="Date of session", class_="form-control")}}
</div>
<div class="form-group">
{{experiment_and_scan_form.scanner.label}}
{{experiment_and_scan_form.scanner(placeholder="Scanner", class_="form-control")}}
</div>
<div class="form-group">
{{experiment_and_scan_form.field_strength.label}}
{{experiment_and_scan_form.field_strength(placeholder="Field Strength", class_="form-control")}}
</div>
{{ experiment_and_scan_form.csrf_token }}
{{ experiment_and_scan_form.hidden_tag() }}
{{ experiment_and_scan_form.scan_file(multiple="multiple") }}
{{ experiment_and_scan_form.submit }}
</form>
解决方案
推荐阅读
- javascript - 随机“未定义”被插入到字符串中
- python - 如何在 ipyvuetify 中从浅色主题切换到深色主题?
- javascript - 如何在 Javascript 中将 (yyyymmddhhss) 形式的日期时间字符串转换为 dd/mm/yyyy?
- validation - 为大数据定义数据质量规则
- algorithm - 运行感知器算法的matlab代码耗时太长
- python - 姜戈。如何向查询中添加字段?
- c# - 将 Excel 单元格设置为 TimeSpan 值
- android - 如何使用viewmodel和livedata将数据从recyclerview传递到android中的片段
- c++ - C++ 17:从模板中的 Callable 推断签名
- kubernetes - 大使 API 网关功能