【发布时间】:2022-01-21 22:45:28
【问题描述】:
虽然“DataRequired”和“NumberRange”会弹出错误消息,但“EqualTo”(以及我自己的自定义“MoreThan”)不会。我怎样才能让他们也产生弹出消息?
############################################## ##################### 我的表单有三个字段。 “min_nFeatures”必须低于“max_nFeatures”,因此我将“EqualTo”验证器的代码更改为“MoreThan”(如Code a validator for a WTForms form which compares the inputs from two fields 中所建议的那样)。验证器正在工作:如果用户为“min_nFeatures”输入更大的值,它不会通过(它返回到同一页面)。但是,没有像其他内置验证器那样弹出消息(例如,如果用户没有输入任何内容,则会弹出“请填写此字段”)。我希望自定义验证器具有相同的行为。
我的代码:
class MoreThan(object):
def __init__(self, fieldname, message=None):
self.fieldname = fieldname
self.message = message
def __call__(self, form, field):
try:
other = form[self.fieldname]
except KeyError:
raise ValidationError(field.gettext("Invalid field name '%s'.") % self.fieldname)
if field.data <= other.data:
d = {
'other_label': hasattr(other, 'label') and other.label.text or self.fieldname,
'other_name': self.fieldname
}
message = self.message
if message is None:
message = field.gettext(
'The maximal number of expressed genes has to be larger than the minimal number of expressed genes')
raise ValidationError(message)
class vln_plot_form(FlaskForm):
min_nFeatures = IntegerField('* Minimal number of expressed genes:', validators=[DataRequired()])
max_nFeatures = IntegerField('* Maximal number of expressed genes:',
validators=[DataRequired(), MoreThan('min_nFeatures')])
max_mtpercent = IntegerField('Maximal percent of mitochondrial gene expression:', validators=[NumberRange(1, 100)])
submit = SubmitField('Submit')
查看:
@app.route('/vln', methods=['POST', 'GET'])
def violin_plots():
...
form = vln_plot_form()
if request.method == 'POST':
if form.validate_on_submit():
...
return redirect(url_for('next_page'))
return render_template('violin_plots.html', form=form)
我阅读了Message not flashing on some WTForm validation methods,但无法将其应用于我的案例。
############################################## ######################### 编辑: 这是我的 HTML 代码:
{% extends 'base.html' %}
{% block head %}
<title>HELLO</title>
{% endblock %}
{% block body %}
<center><h1>Run!</h1></center>
<h2>Step 2/3</h2>
<figure>
<img src={{ vln_plot_file }} align="middle" alt="vln_plot" style="width:70%">
</figure>
<form method="POST" action="" enctype="multipart/form-data">
{{ form.hidden_tag() }}
<div class="form-horizontal">
<div class="form-group col-md-6">
{{ form.csrf_token() }}
<label for=""> {{ form.min_nFeatures.label }}</label>
{{ form.min_nFeatures }}
</div>
<div class="form-group col-md-6">
{{ form.csrf_token() }}
<label for=""> {{ form.max_nFeatures.label }}</label>
{{ form.max_nFeatures }}
</div>
{% if with_mt %}
<div class="form-group col-md-6">
{{ form.csrf_token() }}
<label for=""> {{ form.max_mtpercent.label }}</label>
{{ form.max_mtpercent }}
</div>
{% endif %}
<div class="form-group">
{{ form.csrf_token() }}
{{ form.submit(class="btn btn-primary")}}
</div>
</div>
{% if form.errors %}
{{ form.errors }}
{% endif %}
</form>
{% endblock %}
由于我在 HTML 末尾添加了“{{ form.errors }}”,我确实在网页底部看到了正确的 form.errors,但这当然是一种非常丑陋的显示错误的方式...
【问题讨论】:
-
你能展示一下你的html代码是什么样子的吗?
-
当然,我已将其添加到问题中。
标签: python flask flask-wtforms wtforms