WTForms RadioField, предотвращающий проверку формы - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть форма WTForms, содержащая несколько различных типов полей, все из которых работают, кроме RadioField.

Python: из flask_wtf импортировать FlaskForm из валидаторов импорта wtforms, RadioField, DecimalField

class MyForm(FlaskForm):
    field_one = DecimalField('Field 1', validators=[Optional()]
    field_two = RadioField('Radio', choices=[(True, 'True'), (False, 'False')])
    submit = SubmitField('Submit')

@app.route('/page', methods=['GET', 'POST'])
def page():
    form = MyForm()
    print('Page requested')

    if form.validate_on_submit():
        print('form validated')

    return render_template('/page.html', form=form)

HTML:

<form method="POST">
  <div class="row">
    {{ form.hidden_tag() }}
    {{ form.field_one.label }}
    <div>
      {{ form.field_one }}
    </div>
  </div>
  <div class="row">
    {{ form.hidden_tag() }}
    {{ form.field_two.label }}
    <div>
      {% for subfield in form.field_two %}
        <p>{{ subfield }} - {{ subfield.label }}
      {% endfor %}
    </div>
  </div>
</form>

Когда я вынимаю что-либо, связанное с field_two (RadioField), print('form validated') будет выполняться каждый раз, когда я нажимаю на кнопку submit.

Но как только RadioField включен, форма никогда не проверяется. Я подумал, что это может быть из-за того, что у поля нет связанного валидатора, но оно все равно не работает, когда я добавляю validators=[Optional()] к определению field_two.

Кто-нибудь знает, почему форма не проверена с помощью RadioField?

(Я попробовал четыре варианта, о которых могу подумать. Нажав кнопку отправки с и без выбора опции радио, добавив и удалив необязательный валидатор к определению формы.)

1 Ответ

0 голосов
/ 01 ноября 2018

Я считаю, что это из-за проверки типов. Вы должны сказать это, чтобы привести к булеву так:

field_two = RadioField('Radio', coerce=bool, choices=[(True, 'True'), (False, 'False')])

Редактировать: или, что еще лучше, использовать 1 и 0 и привести к int следующим образом:

field_two = RadioField('Radio', coerce=int, choices=[(1, 'True'), (0, 'False')])

Затем вы можете проверить, является ли значение истинным, или преобразовать его в слишком логическое значение, например:

bool(form.field_two.data)
...