WTForm validate_on_submit () возвращает False для selectField - PullRequest
0 голосов
/ 11 марта 2020

Редактировать, Решено: Метод validate(), который вызывается validate_on_submit(), требует, чтобы значения параметров SelectField были целыми числами. Добавление опции coerce=int к SelectField решило проблему. Поле теперь выглядит так:

time_zone = SelectField('Time Zone', choices=[(-1, '--Select Time Zone--'),(0, 'PST'), (1, 'MST'), (2, 'EST')], coerce=int)

Исходное сообщение:

Я работаю над формой регистрации с использованием WTForms (v2.2.1) в Flask ( v1.1.1). Когда у меня есть SelectField в форме класса, form.validate_on_submit() автоматически возвращает False

Я следовал шаблону в документации и просматривал большинство «похожих вопросов», которые предлагает SO но безрезультатно. Многие другие сообщения отсутствуют {{ form.csrf_token }} или {{ form.hidden_tag() }} ниже тега формы. Я пробовал оба с одинаковым результатом.

forms.py

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField, SelectField
from wtforms.validators import DataRequired, Email, EqualTo, ValidationError


class RegisterForm(FlaskForm):    
    first_name = StringField('First Name', validators=[DataRequired()])
    last_name = StringField('Last Name', validators=[DataRequired()])
    email = StringField('Email Address', validators=[DataRequired(), Email()])
    phone = StringField('Phone Number', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])
    confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
    time_zone = SelectField('Time Zone', choices=[(-1, '--Select Time Zone--'),(0, 'PST'), (1, 'MST'), (2, 'EST')])
    submit = SubmitField('Register')

index. html (Форма отображается на индекс. html страница и обрабатывается в / register route)

{% extends 'base.html' %}

{% block content %}
  <div class="flex-item p-5 register">
    <h2>Register</h2>

    <form action="{{ url_for('register') }}" method="post" novalidate>
      {{ register_form.hidden_tag() }}

      <div class="form-row">
        <div class="form-group col-md-6">
          {{ register_form.first_name.label }}
          {{ register_form.first_name(class="form-control") }}
        </div>
        <div class="form-group col-md-6">
          {{ register_form.last_name.label }}
          {{ register_form.last_name(class="form-control") }}
        </div>
      </div>

      <div class="form-row">
        <div class="form-group col">
          {{ register_form.email.label }}
          {{ register_form.email(class="form-control") }}
        </div>
      </div>

      <div class="form-row">
        <div class="form-group col">
          {{ register_form.phone.label }}
          {{ register_form.phone(class="form-control") }}
        </div>
      </div>

      <div class="form-row">
        <div class="form-group col">
          {{ register_form.password.label }}
          {{ register_form.password(class="form-control") }}
        </div>
      </div>

      <div class="form-row">
        <div class="form-group col">
          {{ register_form.confirm_password.label }}
          {{ register_form.confirm_password(class="form-control") }}
        </div>
      </div>

      <div class="form-row">
        <div class="form-group col">
          {{ register_form.time_zone.label }}
          {{ register_form.time_zone(class="form-control") }}
        </div>
      </div>

      {{ register_form.submit(class="btn btn-primary") }}      

    </form>
  </div>
{% endblock %}

rout.py

from flask import render_template, redirect, url_for, request, flash
from app import app
from app.forms import RegisterForm

@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def index():
    return render_template('index.html', register_form=RegisterForm())

@app.route('/register', methods=['POST'])
def register():
    form = RegisterForm()

    print(form.is_submitted(), form.validate())
    # This is printing (True, False) when there is a SelectField
    # and (True, True) when no SelectField is in the RegisterForm Class
    if form.validate_on_submit():
        print('validating register form')
    return redirect(url_for('index'))

Если я удаляю SelectField из класса RegisterForm validate_on_submit() работает нормально.

Есть мысли о том, что вызывает эту проблему?

...