【问题标题】:WTforms IntegerField in fieldlist never validates using manual iterationfieldlist 中的 WTforms IntegerField 从不使用手动迭代进行验证
【发布时间】:2015-05-03 01:14:20
【问题描述】:

我有一个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

似乎这:Form validation fails due missing CSRF 是解决方案。正在调查...

【问题讨论】:

  • 什么是form,什么是bananas
  • @dirn 见上面的编辑。在for循环中,我遍历fieldlist(formfield())impact来自dpiaThreatAnalysisForm
  • 我指的是您观点中的参考资料。您共享了 一些 代码,但似乎缺少很多重要的东西。您使用从未定义的变量。 form 很可能没有被正确实例化,但在我们看到整个视图之前,很难知道。
  • @dirn 添加了更多查看代码。
  • 您的表单中是否包含 CSRF 令牌?

标签: python python-2.7 flask wtforms flask-wtforms


【解决方案1】:

这个:Form validation fails due missing CSRF 是解决方案。

在以前的版本中,这不是必需的,在安装新的扩展 pip 后,flask-wtf 也更新了...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2013-11-15
    • 2013-03-16
    • 2018-03-21
    • 2019-01-19
    • 1970-01-01
    相关资源
    最近更新 更多