4

我要问的其实很简单。我想创建一个包含一些字段以及一个提交和一个取消按钮的表单。我想使用quick_formFlask-Bootstrap 的模板功能来降低模板的开销。我的表格如下所示:

from flask_wtf import FlaskForm
from wtforms.validators import Required, Length


class SequenceForm(FlaskForm):
    name = StringField('Name:', validators=[Required(), Length(1, 128)])

    # some other fields here

    submit = SubmitField('submit')
    cancel = SubmitField('cancel')

模板:

{% extends 'base.html' %}
{% import 'bootstrap/wtf.html' as wtf %}

{% block content %}
  <div class="container">
    <form method="POST">
      <div class="row">
        <div class="col-xs-12">
          {{ wtf.quick_form(form, button_map={'submit': 'primary'}) }}
        </div>
      </div>
    </form>
  </div>
{% endblock %}

有人会怀疑我想在submit上验证并接受输入值,并在cancel上跳过验证。所以我的视图功能看起来像预期的那样。

@main.route('sequence/', methods=['GET', 'POST'])
def sequence():
    form = SequenceForm()
    if request.method == 'POST':
        if 'submit' in request.form:
            if form.validate_on_submit():
                print(form.duration.data)
        else:
            return redirect(url_for('main.index'))
    return render_template('sequence.html', form=form)

现在,如果按下取消,逻辑上应该没有验证,并且应该进行重定向。但是,我遇到了一个问题,即如果由于客户端验证而按下提交取消,我的视图函数甚至都不会被调用。

<input class="form-control" id="name" name="name" required="" type="text" value="">

有没有办法在 WTForms 上禁用客户端验证?

4

4 回答 4

6

由于您使用 Flask-Bootstrap 的quick_form()宏,您只需将novalidate参数设置True为禁用客户端验证(它将novalidate为您的 HTML<form>元素设置一个属性):

{{ wtf.quick_form(form, novalidate=True) }}

如果你使用的是 Bootstrap-Flask,方法类似:

{{ render_form(form, novalidate=True) }}
于 2020-04-12T03:49:18.213 回答
3

自 WTForms 版本 3 起替换的Required验证器以及DataRequiredInputRequired设置了字段的替换标志。此标志用于将必需的属性添加到字段的 HTML 表示。我的解决方法是手动创建验证函数。Required

from wtforms.validators import ValidationError

def _required(form, field):
    if not field.raw_data or not field.raw_data[0]:
        raise ValidationError('Field is required')

class SequenceForm(FlaskForm):
    name = StringField('Name:', validators=[_required, Length(1, 128)])

    # some other fields here

    submit = SubmitField('submit')
    cancel = SubmitField('cancel')

这种方式在客户端没有验证,并确保在每次提交取消时调用视图函数。

笔记

一个更简单的解决方案是子类化InputRequired验证器并覆盖 field_flags 字典。

from wtforms.validators import InputRequired

class MyInputRequired(InputRequired):
    field_flags = ()

class SequenceForm(FlaskForm):
    name = StringField('Name:', validators=[MyInputRequired(), Length(1, 128)])
于 2016-12-23T12:29:36.497 回答
1

要禁用客户端表单验证,请将“novalidate”属性添加到<form>模板中的 HTML 元素:

<form method="POST" novalidate>

于 2018-11-23T01:27:14.110 回答
1

您可以禁止呈现requiredattr。

class MyTextInput(wtforms.widgets.TextInput):
    def __call__(self, field, **kwargs):
        kwargs['required'] = False
        return super().__call__(field, **kwargs)

对于 Python2 添加这样的参数:super(MyTextInput, self)

接着:

name = StringField('Name:', validators=[Required(), Length(1, 128)], widget=MyTextInput())
于 2016-12-24T09:14:49.687 回答