wtf flaskform fileallowed python flask jinja2

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



install wtforms (5)

Tengo un formulario de contacto muy simple y me gustaría ocultar la etiqueta de alguna manera para que no muestre 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 declaración 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 %}


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 here 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 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 %}


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 tropiezan con 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 %}