Maintenant qu'on a notre classe LoginForm, il faut l'envoyer au template.
Dans app.py :
from forms import LoginForm
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
return render_template('login.html', form=form)
Dans templates/login.html :
<form method="POST">
<!-- TRÈS IMPORTANT : Le jeton de sécurité CSRF -->
{{ form.hidden_tag() }}
<div>
{{ form.email.label }} <br>
{{ form.email(size=30, class="form-control") }}
<!-- Affichage des erreurs éventuelles -->
{% for error in form.email.errors %}
<span style="color: red;">{{ error }}</span>
{% endfor %}
</div>
<div>
{{ form.password.label }} <br>
{{ form.password() }}
{% for error in form.password.errors %}
<span style="color: red;">{{ error }}</span>
{% endfor %}
</div>
<div>
{{ form.submit() }}
</div>
</form>
Explications :
{{ form.hidden_tag() }}: Génère un champ caché<input type="hidden">avec le token CSRF. Si tu l'oublies, le formulaire sera rejeté.{{ form.email() }}: Génère le<input type="text" ...>. Tu peux lui passer des attributs CSS commeclass="form-control".form.email.errors: Si la validation échoue, la liste des erreurs est ici.
C'est là que les Macros (du module précédent) deviennent utiles pour ne pas répéter la boucle des erreurs à chaque champ !