2012-05-26 13 views
19

Tengo un formulario de contacto muy simple y me gustaría ocultar la etiqueta de alguna manera para que no se muestre Csrf Token. Estoy utilizando el frasco y el frasco-WTForms y estoy haciendo que la forma como esto:¿Hay alguna manera de ocultar la etiqueta csrf mientras recorre el formulario usando Flask y Flask-WTForms?

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

Así que, básicamente, esto demuestra mis entradas correctamente y el oen csrf está oculto, pero la etiqueta no se oculta? ¿Debo superarlo e implícitamente decir form.field_name en lugar de recorrer el formulario o hay una manera de manejar este "caso de esquina".

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

Gracias

EDIT: He "fija" el problema al hacer esto, pero se siente un poco sucio y hacky, que no me gusta todavía estoy abierto a una solución mejor:

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

Respuesta

30

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

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

form.hidden_tag() es suministrada por frasco -WTF.

+0

, ¿quiere decir que '{{form.csrf_token}}' se usará automáticamente si solo usa 'form.hidden_tag()'? – lovesh

+0

Esta no es una buena solución, elimina el campo csrf. – mickey06

+0

su solución funciona, pero no entiendo cómo presentar errores de campo. form.errors.field no funciona – micgeronimo

3

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.

+1

Sí, lo descubrí poco después: http://stackoverflow.com/a/10764703/1165441. – edhedges

5

creo que esto debería funcionar también:

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

Mejor uso 'short_name' - de lo contrario se romperá si el formulario tiene un prefijo. – ThiefMaster

7

Sólo para añadir a la excelente respuesta de JD ...

Para aquellos tropezarse con esta pregunta: Puede evitar la pérdida de la (CSRF) campo oculto (y por lo tanto la protección), añadiendo la condición "si el campo. widget.input_type! = 'hidden' "específicamente a la etiqueta en lugar de al repetidor del formulario.

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

Hice una macro recientemente para enviar formularios a través de Ajax con el fin de que no vuelva a cargar la página web y enviarlo a la API directamente.

{% 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 %} 
Cuestiones relacionadas