Подтвердить что ты не робот

Есть ли способ скрыть метку 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 %}
4b9b3361

Ответ 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 %}