有没有办法在使用Flask和Flask-WTForms循环表单时隐藏csrf标签?

edh*_*ges 27 python jinja2 flask

我有非常简单的联系表格,我想以某种方式隐藏标签,以便它不显示Csrf Token.我正在使用Flask和Flask-WTForms,我正在渲染这样的表单:

{% for field in form %}
    {{ field.label }}
    {{ field }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

所以基本上这显示我的输入正确,并且隐藏了csrf,但标签没有被隐藏?我应该克服它并隐含地说,form.field_name而不是循环通过表单或有办法处理这个"角落案例".

我正在考虑在for循环声明或标签声明中进行逻辑检查,但到目前为止,我还没有找到有效的文档中的任何内容.

谢谢

编辑:我已经通过这样做"修复"了这个问题,但感觉有点肮脏和黑客,我不喜欢我仍然愿意接受更好的解决方案:

{% if not loop.first %}
    {{ field.label }}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

jd.*_*jd. 42

如果您想要一个适用于所有隐藏字段而不仅仅是CSRF令牌的更通用的解决方案:

{{ form.hidden_tag() }}
{% for field in form if field.widget.input_type != 'hidden' %}
  {{ field.label }}
  {{ field }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

form.hidden_tag() 由Flask-WTF提供.

  • @ mickey06:通过hidden_​​tag()插入csrf字段 (2认同)

小智 8

只是为了增加JD的优秀答案......

对于那些在这个问题上遇到困难的人:你可以通过将条件"if field.widget.input_type!='hidden'"专门添加到标签而不是表单迭代器来避免丢失(csrf)隐藏字段(从而保护).

即:

{{ form.hidden_tag() }}
{% for field in form if field.widget.input_type != 'hidden' %}
      {{ field.label }}
{{ field }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

{{ form.hidden_tag() }}
{% for field in form %}
  {% if field.widget.input_type != 'hidden' %} {{ field.label }} {% endif %}
  {{ field }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)


dor*_*oru 5

我认为这也应该有效:

{% for field in form if field.id != 'csrf_token' %}
    {{ field.label }}
    {{ field }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)