Форма колбы не отображает ошибки при использовании пользовательских валидаторов - PullRequest
0 голосов
/ 06 сентября 2018

Я создаю пользовательские валидаторы для своих входов в форму Flask и, в качестве примера, ниже я определил функцию, которая проверяет, включили ли вы «s3: //» во входные данные, и если нет, я хочу выбросить ошибку.

Когда я проверяю это и опускаю "s3: //" на входе, ошибка не выдается. Что я делаю не так?

Форма класса:

from flask_wtf import FlaskForm
from wtforms import StringField, TextField, SubmitField, IntegerField, SelectField, validators
from wtforms.validators import ValidationError
import boto3

# CUSTOM VALIDATOR
def is_s3_uri(form, field):
    if "s3://" not in field.data:
        raise ValidationError('Bucket name must contain full path. Missing "s3://".')

class InputForm(FlaskForm):

    input_uri = StringField('INPUT BUCKET', validators=[validators.required(), is_s3_uri])
    output_uri = StringField('OUTPUT BUCKET', validators=[validators.required(), is_s3_uri])

HTML:

<div class="tab">
    <h3>File Locations:</h3>
    <div class="form-group required">
        {{ form.input_uri.label }}: {{ form.input_uri(placeholder="(e.g. s3://pipeline-run/fastqs/)...", oninput=", this.className = ''") }}
    </div>
        {% if form.input_uri.errors %}
            <ul class="errors">{% for error in form.input_uri.errors %}<li>{{ error }}</li>{% endfor %}</ul>
        {% endif %}
    <div class="form-group required">
        {{ form.output_uri.label }}: {{ form.output_uri(placeholder="(e.g. s3://pipeline-run/results/)...", oninput="this.className = ''") }}
    </div>
        {% if form.input_uri.errors %}
            <ul class="errors">{% for error in form.output_uri.errors %}<li>{{ error }}</li>{% endfor %}</ul>
        {% endif %}
</div>

UPDATE

Я также пытался добавить встроенный валидатор (например, с Length(min=6, max=120)), но это также не применяется).

stack_name = StringField('STACK NAME', validators=[Length(min=4, max=120), DataRequired()])

ОБНОВЛЕНИЕ 2 :

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

   INPUT_URI = ''
   OUTPUT_URI = ''

   form = InputForm(request.form)

   if request.method == 'POST':
       if form.validate_on_submit():
           INPUT_URI = request.form['input_uri']
           OUTPUT_URI = request.form['output_uri']

           # process info

       else:
           flash('Invalid params. Please re-try.', 'danger')
           return redirect(request.path)

   return render_template('pipeline-alt.html', 
                        title='Pipeline Input', 
                        form=form)

ОБНОВЛЕНИЕ 3 : Использование плагина проверки формы Jquery

HTML:

<div class="form-group required">
    {{ form.input_uri.label }}: {{ form.input_uri(placeholder="(e.g. s3://pipeline-run/fastqs/)...", oninput=", this.className = ''", name="input_uri") }}
</div>

JQuery:

<script>

$(document).ready(function () {

    $('#regForm').validate({ // initialize the plugin
        rules: {
            input_uri: {
                required: true,
                minlength: 4
            }
        },
        submitHandler: function (form) { // for demo
            alert('valid form submitted'); // for demo
            return false; // for demo
        }
    });

});

</script>

Результат: TypeError: html_params() got multiple values for keyword argument 'name'

1 Ответ

0 голосов
/ 07 сентября 2018

Подтверждаете ли вы свою форму при отправке? Вы не опубликовали достаточно кода, но я постараюсь помочь.

В представлении, которое отображает, вы должны использовать form.validate_on_submit(), чтобы ваша форма была проверена. Я не вижу весь код формы в опубликованном вами HTML-коде, и если это так, то вам не хватает кнопки отправки, которая отправит форму на сервер для проверки.

Пожалуйста, оставьте свой вид (который отображает форму) код

Ваша форма должна использовать POST в методе для примера ниже. Пример того, как должно выглядеть ваше представление, которое обрабатывает форму, с form.validate_on_submit()

from flask import request
@app.route('/form_route', methods=['GET', 'POST'])
def form_route():
    form = YourFormClass()
    if request.method == 'POST':
        if form.validate_on_submit():
        # validation will be triggered from the if statement and if it validates, it will enter this if block
        # perform actions if the form is valid
        else:
        # do somthing if the form is not valid
    return render_template(form=form)
...