35

我有非常简单的联系表格,我想以某种方式隐藏标签,使其不显示Csrf Token。我正在使用 Flask 和 Flask-WTForms 并呈现如下形式:

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

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

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

谢谢

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

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

5 回答 5

47

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

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

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

于 2012-05-29T13:10:48.173 回答
8

我认为这也应该有效:

{% for field in form if field.id != 'csrf_token' %}
    {{ field.label }}
    {{ field }}
{% endfor %}
于 2012-05-26T08:13:49.723 回答
8

只是为了增加JD的出色答案......

对于那些偶然发现这个问题的人:您可以通过将条件“if field.widget.input_type!='hidden'”专门添加到标签而不是表单迭代器来避免丢失(csrf)隐藏字段(从而保护)。

IE:

不是

{{ 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 %}
于 2014-11-19T21:42:42.270 回答
3

我找到了这样做的方法:

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

我相信这不那么骇人听闻。我通过修改文档中的示例找到了这一点。

于 2012-05-26T02:50:26.860 回答
1

我最近做了一个宏来通过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 %}
于 2017-06-22T15:01:06.907 回答