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