![](/img/trans.png)
[英]Populating a list using FieldList, FormField, and populate_obj in WTForms, with adding items client-side
[英]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驗證器以及DataRequired和InputRequired替換了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.