Загрузка файла форм WTF Flask: FileRequired () не проходит проверку, когда форма загрузки наследуется от другой формы, даже если файл присутствует - PullRequest
0 голосов
/ 14 января 2019

У меня есть форма, которая собирает некоторую информацию, и форма, которая позволяет пользователю загружать файл. Они оба работают. Сейчас я пытаюсь создать форму, которая объединяет их и наследует от обоих.

Моя форма загрузки файлов имеет валидатор FileRequired (). Это проходит нормально, когда я получаю доступ только к форме загрузки. Если у меня есть комбинированная форма, попытайтесь унаследовать форму загрузки, проверка не пройдена. Однако, если я удалю валидатор FileRequired (), либо удалив его из формы, от которой он наследует, либо заменив это поле в комбинированной форме, файл загрузится нормально. Сбой проверки, а не загрузка файла. Я могу проверить другим способом (проверяя длину request.files.getlist('<file>'), и фактически уже проверяю, чтобы пользователь не мог загрузить слишком много файлов, поэтому у меня есть обходной путь, но я хотел бы понять, почему это не удается.

Вот мои взгляды.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. Удаление FileRequired() из ExperimentAndScanForm (либо путем удаления его из ScanForm, либо замены свойства 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>
...