WTforms字段列表中的IntegerField从不使用手动迭代进行验证



我有一个InterField,它验证数字是否在值099之间。出于某种原因,它从未验证过。我有一种感觉,它与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

似乎是这样的:由于缺少CSRF,表单验证失败是解决方案。正在调查。。。

这:表单验证失败,因为缺少CSRF是解决方案。

在以前的版本中,这是不需要的,在安装了新的扩展pip后,更新了烧瓶wtf。。。

最新更新