Есть ли способ скрыть метку csrf при циклировании формы с помощью Flask и Flask-WTForms?
У меня очень простая форма контакта, и я хотел бы как-то скрыть ярлык, чтобы он не показывал Csrf Token
. Я использую Flask и Flask-WTForms, и я представляю форму следующим образом:
{% for field in form %}
{{ field.label }}
{{ field }}
{% endfor %}
Итак, в основном это показывает мои входы правильно, и csrf oen скрыт, но ярлык не скрыт? Должен ли я преодолеть это и косвенно сказать form.field_name
вместо того, чтобы перебирать форму или есть способ обработать этот "угловой случай".
Я думал о логической проверке либо в объявлении цикла цикла, либо в объявлении метки, но до сих пор я ничего не нашел в документации, которая сработала.
Спасибо
EDIT: я "исправил" проблему, делая это, но он чувствует себя немного грязным и взломанным, что мне не нравится. Я все еще открыт для лучшего решения:
{% if not loop.first %}
{{ field.label }}
{% endif %}
Ответы
Ответ 1
Если вам требуется более общее решение, которое работает для всех скрытых полей, а не только токена CSRF:
{{ form.hidden_tag() }}
{% for field in form if field.widget.input_type != 'hidden' %}
{{ field.label }}
{{ field }}
{% endfor %}
form.hidden_tag()
предоставляется Flask-WTF.
Ответ 2
Просто чтобы добавить к JD отличный ответ...
Для тех, кто сталкивается с этим вопросом: Вы можете избежать потери скрытого поля (csrf) (и, следовательно, защиты), добавив условие "if field.widget.input_type! =" hidden "" в частности к метке, а не к итератору формы.
i.e.:
не
{{ 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 %}
Ответ 3
Я думаю, что это тоже должно работать:
{% for field in form if field.id != 'csrf_token' %}
{{ field.label }}
{{ field }}
{% endfor %}
Ответ 4
Я нашел способ сделать это вот так:
{% if field.id != 'csrf_token' %}
Я считаю, что это менее хаки. Я нашел это от изменения примера здесь в документах.
Ответ 5
Недавно я сделал макрос для отправки форм через 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 %}