簡體   English   中英

WTForms:在取消時禁用客戶端驗證

[英]WTForms: Disable client-side validation on cancel

我要求的其實很簡單。 我想創建一個包含一些字段和一個提交和一個取消按鈕的表單。 我想使用 Flask-Bootstrap 的quick_form模板函數來降低模板中的開銷。 我的表格是這樣的:

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 %}

正如人們所懷疑的那樣,我想在提交時驗證並接受輸入值,並在取消時跳過驗證。 所以我的視圖函數看起來像預期的那樣。

@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 上禁用客戶端驗證?

由於您使用 Flask-Bootstrap 的quick_form()宏,您可以將novalidate參數設置為True以禁用客戶端驗證(它將為您的 HTML <form>元素設置novalidate屬性):

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

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

{{ render_form(form, novalidate=True) }}

從 WTForms 的第 3 版開始, Required驗證器以及DataRequiredInputRequired替換了Required ,設置了該字段的替換標志。 此標志用於將required屬性添加到字段的 HTML 表示中。 我的解決方法是手動創建驗證函數。

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)])

您可以禁止呈現required屬性。

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())

要禁用客戶端表單驗證,請將“novalidate”屬性添加到模板中的 HTML <form>元素:

<form method="POST" novalidate>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM