2012-05-26 4 views
19

Ho un modulo di contatto molto semplice e vorrei nascondere l'etichetta in qualche modo in modo che non mostri Csrf Token. Sto usando Flask e Flask-WTForms e sto rendendo il modulo come questo:C'è un modo per nascondere l'etichetta csrf mentre si scorre attraverso il modulo usando Flask e Flask-WTForms?

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

Quindi, in pratica questa mostra il mio ingressi correttamente e l'OEN CSRF è nascosto, ma l'etichetta non è nascosto? Devo passare sopra e implicitamente dire form.field_name invece di eseguire il ciclo attraverso il modulo o c'è un modo per gestire questo "caso angolo".

Stavo pensando di eseguire un controllo logico nella dichiarazione del ciclo for o nella dichiarazione dell'etichetta, ma finora non ho trovato nulla nella documentazione che ha funzionato.

Grazie

EDIT: Ho "fissa" il problema in questo modo, ma ci si sente un po 'sporca e hacky che non mi piace sono ancora aperti a una soluzione migliore:

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

risposta

30

Se si desidera una soluzione più generale che funziona per tutti i campi nascosti invece che solo il token CSRF:

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

form.hidden_tag() è fornito da Flask -WTF.

+0

quindi vuoi dire che '{{form.csrf_token}}' è usato automaticamente se usi semplicemente 'form.hidden_tag()'? – lovesh

+0

Questa non è una buona soluzione, elimina il campo csrf. – mickey06

+0

la soluzione funziona, ma non riesco a capire come eseguire il rendering degli errori di campo. form.errors.field non funziona – micgeronimo

3

Ho trovato il modo di farlo in questo modo:

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

Credo che questo sia meno hacky. Ho trovato questo da modificare l'esempio here nei documenti.

+1

Sì, l'ho capito poco dopo: http://stackoverflow.com/a/10764703/1165441. – edhedges

5

penso che questo dovrebbe funzionare anche:

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

Meglio usare 'short_name' - altrimenti si interromperà se il form ha un prefisso. – ThiefMaster

7

Giusto per aggiungere alla risposta eccellente di JD ...

Per coloro imbattersi in questa domanda: È possibile evitare di perdere il (CSRF) campo nascosto (e quindi di protezione) aggiungendo la condizione "se il campo. widget.input_type! = 'hidden' "specifico per l'etichetta anziché per l'iteratore del modulo.

cioè:

non

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

ma

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

ho fatto una macro di recente a presentare forme attraverso le ajax al fine di non ricaricare la pagina web e inviarlo alle API direttamente.

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