¿Hay alguna forma de ocultar la etiqueta csrf mientras recorre el formulario utilizando Flask y Flask-WTForms?

Tengo un formulario de contacto muy simple y me gustaría ocultar la etiqueta de alguna manera para que no muestre el Csrf Token . Estoy usando Flask y Flask-WTForms y estoy mostrando la forma de esta manera:

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

¿Así que básicamente esto muestra mis entradas correctamente y el csrf oen está oculto pero la etiqueta no está oculta? Debería form.field_name y decir implícitamente form.field_name lugar de recorrer el formulario o hay una manera de manejar este “caso de esquina”.

Estaba pensando en hacer una comprobación lógica de la statement de bucle for o de la etiqueta, pero hasta ahora no he encontrado nada en la documentación que haya funcionado.

Gracias

EDIT: He “arreglado” el problema haciendo esto, pero se siente un poco sucio y pirateado que no me gusta. Todavía estoy abierto a una mejor solución:

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

Related of "¿Hay alguna forma de ocultar la etiqueta csrf mientras recorre el formulario utilizando Flask y Flask-WTForms?"

Si desea una solución más general que funcione para todos los campos ocultos en lugar de solo el token CSRF:

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

form.hidden_tag() es suministrado por Flask-WTF.

Solo para agregar a la excelente respuesta de JD …

Para aquellos que se encuentran en esta pregunta: puede evitar perder el campo oculto (csrf) (y, por lo tanto, la protección) agregando la condición “if field.widget.input_type! = ‘Hidden'” específicamente a la etiqueta en lugar de al iterador de formularios.

es decir:

no

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

pero

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

Creo que esto debería funcionar también:

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

He encontrado la manera de hacerlo así:

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

Creo que esto es menos hacky. Encontré esto al modificar el ejemplo aquí en los documentos.

Hice una macro recientemente para enviar formularios a través de ajax para no volver a cargar la página web y enviarla directamente a la api.

 {% macro render_fields3(form, form_name, method) %} 
{{ form.hidden_tag() }} {% for field in form if field.widget.input_type != 'hidden' %}
{{ field.label }}
{{field(id=field.name + method)|safe}} {% if field.errors %}
    {% for error in field.errors %}
  • {{ error }}
  • {% endfor %}
{% endif %}
{% endfor %}
{% endmacro %}