字段列表中的 WTforms IntegerField 从不使用手动迭代进行验证
WTforms IntegerField in fieldlist never validates using manual iteration
我有一个 InterField
,用于验证数字是否介于值 0
和 99
之间。由于某种原因,它永远不会验证。
我感觉它与 FieldList
以及我在模板中迭代它的方式有关,但似乎无法使其正常工作。
表格:
class dpiaImpactAnalysisForm(Form):
severity_score = IntegerField("Severity Score"),
validators=[NumberRange(min=0, max=99, message="Please provide a valid number")]))
identifiability_score = IntegerField("Identifiability Score"),
validators=[NumberRange(min=0, max=99, message="Please provide a valid number")]))
class dpiaThreatAnalysisForm(Form):
impact = FieldList(FormField(dpiaImpactAnalysisForm), min_entries=1)
在视图中,我根据需要动态附加条目:
@app.route('/dpia/analysis/<project_id>', methods=["GET", "POST"])
def analysis(project_id):
form = dpiaThreatAnalysisForm()
prim = Assets.query.filter_by(selected=True, primary=True).all()
primary_assets = list(map(vars, prim))
ev = Events.query.all()
events = list(map(vars, ev))
# add fields to the form...
for z in range(len(prim) * len(ev)):
form.impact.append_entry()
supp = Assets.query.filter_by(selected=True, primary=False).all()
supporting_assets = list(map(vars, supp))
ths = Threats.query.all()
threats = list(map(vars, ths))
# add fields to the form
for z in range(len(ths) * len(supp)):
form.likelihood.append_entry()
if form.is_submitted():
print "submitted"
if form.validate():
print "valid"
print form.errors
if form.validate_on_submit():
# This is never printed:
app.logger.info("success!!")
pprint(form.likelihood)
return redirect(url_for(next_step, project_id=project_id))
return render_template('analysis.html', form=form, threats=threats, supporting_assets=supporting_assets, primary_assets=primary_assets, events=events)
在模板中,我在列表 events
中迭代列表 primary_assets
,并在每次迭代中添加字段:
{% for val in events %}
{% if not counter or loop.index0 == 0 %}
{% set counter = [] %} <!-- loop hack !-->
{% endif %}
<strong>Event: {{ val.name }}</strong><br />
Jeopardizes: {{ val.jeopardizes }}<br />
{% for pa in primary_assets %}
<strong>{{ pa['name'] }}</strong><br />
{{ form.impact[counter|length].identifiability_score(placeholder='') }} <br />
{{ form.impact[counter|length].severity_score(placeholder='') }}
{{ form.impact[counter|length].hidden_tag() }}
{% if counter.append('1') %}{% endif %}
{% endfor %}
{% endfor %}
hidden_tag()
也不行。通常我用
之类的东西迭代表格
{% for impact in form.impact %}
{{ impact.form.hidden_tag() }}
# do cbg
{% endfor %}
这行得通,这就是为什么我认为是我的手动循环破坏了它...
编辑 3 月 2 日,17:26
经过一些测试,我发现使用
severity_score = IntegerField("Severity Score", validators=[Optional(), NumberRange(
min=0, max=9999999999, message="Please provide a valid number")])
有效(如果我设置 min=50
我在插入低于 50 的数字时收到错误消息),但是,CSRF 仍然没有通过。
{{ form.impact[counter|length].hidden_tag() }}
或
{{ form.impact[counter|length].form.hidden_tag() }}
两者都不工作:(
我得到:{'impact': [{'csrf_token': ['CSRF token missing']}, {'csrf_token': ['CSRF token missing']}]}
编辑18:22
似乎这个:Form validation fails due missing CSRF 是解决方案。正在调查...
这:Form validation fails due missing CSRF 是解决方案。
在以前的版本中这不是必需的,并且在安装新的扩展 pip 之后也更新了 flask-wtf...
我有一个 InterField
,用于验证数字是否介于值 0
和 99
之间。由于某种原因,它永远不会验证。
我感觉它与 FieldList
以及我在模板中迭代它的方式有关,但似乎无法使其正常工作。
表格:
class dpiaImpactAnalysisForm(Form):
severity_score = IntegerField("Severity Score"),
validators=[NumberRange(min=0, max=99, message="Please provide a valid number")]))
identifiability_score = IntegerField("Identifiability Score"),
validators=[NumberRange(min=0, max=99, message="Please provide a valid number")]))
class dpiaThreatAnalysisForm(Form):
impact = FieldList(FormField(dpiaImpactAnalysisForm), min_entries=1)
在视图中,我根据需要动态附加条目:
@app.route('/dpia/analysis/<project_id>', methods=["GET", "POST"])
def analysis(project_id):
form = dpiaThreatAnalysisForm()
prim = Assets.query.filter_by(selected=True, primary=True).all()
primary_assets = list(map(vars, prim))
ev = Events.query.all()
events = list(map(vars, ev))
# add fields to the form...
for z in range(len(prim) * len(ev)):
form.impact.append_entry()
supp = Assets.query.filter_by(selected=True, primary=False).all()
supporting_assets = list(map(vars, supp))
ths = Threats.query.all()
threats = list(map(vars, ths))
# add fields to the form
for z in range(len(ths) * len(supp)):
form.likelihood.append_entry()
if form.is_submitted():
print "submitted"
if form.validate():
print "valid"
print form.errors
if form.validate_on_submit():
# This is never printed:
app.logger.info("success!!")
pprint(form.likelihood)
return redirect(url_for(next_step, project_id=project_id))
return render_template('analysis.html', form=form, threats=threats, supporting_assets=supporting_assets, primary_assets=primary_assets, events=events)
在模板中,我在列表 events
中迭代列表 primary_assets
,并在每次迭代中添加字段:
{% for val in events %}
{% if not counter or loop.index0 == 0 %}
{% set counter = [] %} <!-- loop hack !-->
{% endif %}
<strong>Event: {{ val.name }}</strong><br />
Jeopardizes: {{ val.jeopardizes }}<br />
{% for pa in primary_assets %}
<strong>{{ pa['name'] }}</strong><br />
{{ form.impact[counter|length].identifiability_score(placeholder='') }} <br />
{{ form.impact[counter|length].severity_score(placeholder='') }}
{{ form.impact[counter|length].hidden_tag() }}
{% if counter.append('1') %}{% endif %}
{% endfor %}
{% endfor %}
hidden_tag()
也不行。通常我用
{% for impact in form.impact %}
{{ impact.form.hidden_tag() }}
# do cbg
{% endfor %}
这行得通,这就是为什么我认为是我的手动循环破坏了它...
编辑 3 月 2 日,17:26
经过一些测试,我发现使用
severity_score = IntegerField("Severity Score", validators=[Optional(), NumberRange(
min=0, max=9999999999, message="Please provide a valid number")])
有效(如果我设置 min=50
我在插入低于 50 的数字时收到错误消息),但是,CSRF 仍然没有通过。
{{ form.impact[counter|length].hidden_tag() }}
或
{{ form.impact[counter|length].form.hidden_tag() }}
两者都不工作:(
我得到:{'impact': [{'csrf_token': ['CSRF token missing']}, {'csrf_token': ['CSRF token missing']}]}
编辑18:22
似乎这个:Form validation fails due missing CSRF 是解决方案。正在调查...
这:Form validation fails due missing CSRF 是解决方案。
在以前的版本中这不是必需的,并且在安装新的扩展 pip 之后也更新了 flask-wtf...