我有非常简单的联系表格,我想以某种方式隐藏标签,以便它不显示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 %}
答案 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)
答案 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 %}