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

时间:2012-05-26 02:20:40

标签: python flask jinja2

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

{% for field in form %}
    {{ field.label }}
    {{ field }}
{% endfor %}

所以基本上这显示我的输入正确并且隐藏了csrf但是标签没有被隐藏?我应该克服它并隐含地说form.field_name而不是循环遍历表单,或者有办法处理这个“极端情况”。

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

由于

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

{% if not loop.first %}
    {{ field.label }}
{% endif %}

5 个答案:

答案 0 :(得分:36)

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

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

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

答案 1 :(得分:8)

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

对于那些在这个问题上遇到困扰的人:你可以通过添加条件来避免丢失(csrf)隐藏字段(从而保护)" if field.widget.input_type!=&# 39;隐藏' "特别是标签而不是形式迭代器。

即:

<强>不

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

<强>但

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

答案 2 :(得分:5)

我认为这也应该有效:

{% for field in form if field.id != 'csrf_token' %}
    {{ field.label }}
    {{ field }}
{% endfor %}

答案 3 :(得分:3)

我找到了这样做的方法:

{% if field.id != 'csrf_token' %}

我相信这不会那么黑客。我通过修改文档中的示例here找到了这个。

答案 4 :(得分:0)

我最近制作了一个宏来通过ajax提交表单,以便不重新加载网页并直接发送到api。

{% macro render_fields3(form, form_name, method) %}
<form class="ajax" name={{ form_name }} method={{ method }}>
{{ form.hidden_tag() }}
{% for field in form if field.widget.input_type != 'hidden' %}
    <dt>{{ field.label }}
    <dd>{{field(id=field.name + method)|safe}}
    {% if field.errors %}
      <ul class=errors>
      {% for error in field.errors %}
        <li>{{ error }}</li>
      {% endfor %}
      </ul>
    {% endif %}
    </dd>
  {% endfor %}

</form>
{% endmacro %}