MrL*_*eeh 3 python flask wtforms flask-wtforms flask-bootstrap
我要求的其实很简单。我想创建一个包含一些字段和一个提交和一个取消按钮的表单。我想使用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')
Run Code Online (Sandbox Code Playgroud)
模板:
{% 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 %}
Run Code Online (Sandbox Code Playgroud)
正如人们所怀疑的那样,我想在提交时验证并接受输入值,并在取消时跳过验证。所以我的视图函数看起来像预期的那样。
@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)
Run Code Online (Sandbox Code Playgroud)
现在,如果按下取消,则逻辑上应该没有验证并且应该进行重定向。但是,我遇到的问题是,如果由于客户端验证而按下提交或取消,我的视图函数甚至不会被调用。
<input class="form-control" id="name" name="name" required="" type="text" value="">
Run Code Online (Sandbox Code Playgroud)
有没有办法在 WTForms 上禁用客户端验证?
由于您使用 Flask-Bootstrap 的quick_form()宏,您只需将novalidate参数设置True为禁用客户端验证(它将novalidate为您的 HTML<form>元素设置一个属性):
{{ wtf.quick_form(form, novalidate=True) }}
Run Code Online (Sandbox Code Playgroud)
如果你使用的是 Bootstrap-Flask,方法类似:
{{ render_form(form, novalidate=True) }}
Run Code Online (Sandbox Code Playgroud)
必需的验证器以及自 WTForms 版本 3 起替换的DataRequired和InputRequired设置字段的替换标志。该标志用于将必需的属性添加到字段的 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')
Run Code Online (Sandbox Code Playgroud)
这样,客户端就不会进行验证,并且可以确保在每次提交或取消时调用视图函数。
笔记
一个更简单的解决方案是对InputRequired验证器进行子类化并覆盖 field_flags 字典。
from wtforms.validators import InputRequired
class MyInputRequired(InputRequired):
field_flags = ()
class SequenceForm(FlaskForm):
name = StringField('Name:', validators=[MyInputRequired(), Length(1, 128)])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4599 次 |
| 最近记录: |