Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédente | |||
| dev:python:flask:flask_formulaires_wtforms [2026/04/11 10:22] – yoann | dev:python:flask:flask_formulaires_wtforms [2026/04/12 10:26] (Version actuelle) – yoann | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| {{tag> | {{tag> | ||
| - | :TODO: | + | :TODO_DOCUPDATE: |
| ====== Flask : Créer des formulaires via Flask-WTF ====== | ====== Flask : Créer des formulaires via Flask-WTF ====== | ||
| Ligne 140: | Ligne 140: | ||
| - | ===== filters | + | ===== Les filtres |
| - | Les filtres permettent de traiter | + | Les filtres |
| * Retirer les espaces en début et fin de saisie ; | * Retirer les espaces en début et fin de saisie ; | ||
| * Passer la saisie en majuscule, en minuscule ; | * Passer la saisie en majuscule, en minuscule ; | ||
| - | * Arrondir etc. | + | * Arrondir |
| Ligne 163: | Ligne 163: | ||
| Ci-dessus, on utilise les filtres pour retirer les espaces autour de la saisie et la passer en majuscules. | Ci-dessus, on utilise les filtres pour retirer les espaces autour de la saisie et la passer en majuscules. | ||
| - | ===== validators | + | ===== Les validateurs |
| Les **validators** permettent de contrôler la saisie de l' | Les **validators** permettent de contrôler la saisie de l' | ||
| Ligne 171: | Ligne 171: | ||
| from flask_wtf import FlaskForm | from flask_wtf import FlaskForm | ||
| from wtforms import StringField | from wtforms import StringField | ||
| - | from wtforms.validators import | + | from wtforms.validators import |
| class RegisterForm(FlaskForm): | class RegisterForm(FlaskForm): | ||
| - | email = StringField(label=' | + | email = StringField(label=' |
| </ | </ | ||
| Ligne 182: | Ligne 182: | ||
| * La saisie doit respecter le formalisme d'un email. | * La saisie doit respecter le formalisme d'un email. | ||
| - | Dans ce cas, peut également utiliser | + | Dans ce cas, peut également utiliser |
| <code python> | <code python> | ||
| Ligne 194: | Ligne 194: | ||
| </ | </ | ||
| - | Il existe de nombreux validators citons par exemple **DataRequired**, **Length**, **Email**, **URL**, **NumberRange**, | + | Il existe de nombreux validators citons par exemple **InputRequired**, **Length**, **Email**, **URL**, **NumberRange**, |
| * Ici la [[https:// | * Ici la [[https:// | ||
| - | ===== Validation ===== | ||
| - | C'est la fonction contrôleur qui se charge de valider le formulaire retourné en méthode POST | ||
| ===== Rendu du formulaire dans le template ===== | ===== Rendu du formulaire dans le template ===== | ||
| Ligne 206: | Ligne 204: | ||
| Du côté du template, on peut s' | Du côté du template, on peut s' | ||
| + | <code html _helpers.html> | ||
| + | {# | ||
| + | Produire le code HTML d'un champ de formulaire. | ||
| + | #} | ||
| + | {% macro render_field_with_div(field) %} | ||
| + | <div> | ||
| + | {{ field.label }} {{ field(**kwargs)|safe }} | ||
| + | {% if field.errors %} | ||
| + | <ul class=errors> | ||
| + | {% for error in field.errors %} | ||
| + | < | ||
| + | {% endfor %} | ||
| + | </ul> | ||
| + | {% endif %} | ||
| + | </ | ||
| + | {% endmacro %} | ||
| + | </ | ||
| + | Une fois la macro définie, on peut l' | ||
| + | |||
| + | <code html> | ||
| + | <div> | ||
| + | {% from " | ||
| + | <form method=" | ||
| + | {{ form.csrf_token }} | ||
| + | {{ render_field_with_div(form.first_name) }} | ||
| + | {{ render_field_with_div(form.last_name) }} | ||
| + | {{ render_field_with_div(form.email) }} | ||
| + | {{ render_field_with_div(form.subject) }} | ||
| + | {{ render_field_with_div(form.message) }} | ||
| + | {{ render_field_with_div(form.submit_button) }} | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Validation ===== | ||
| + | |||
| + | C'est la fonction contrôleur de la vue qui se charge de valider le formulaire retourné en méthode POST. | ||
| + | |||
| + | <code python [highlight_lines_extra=" | ||
| + | @frontend_bp.post('/ | ||
| + | def parse_contact_form(): | ||
| + | """ | ||
| + | Analyse le formulaire de contact renseigné par l' | ||
| + | """ | ||
| + | from app.services.forms import ContactForm | ||
| + | form = ContactForm() | ||
| + | if form.validate_on_submit(): | ||
| + | # Les valeurs saisies sont correctes | ||
| + | return redirect(url_for(' | ||
| + | else: | ||
| + | # Reafficher le formulaire pour permettre à l' | ||
| + | flash(' | ||
| + | return render_template(' | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | L' | ||
| + | </ | ||
| + | |||
| + | La méthode '' | ||
| + | |||
| + | |||
| + | ===== Débogages ===== | ||
| + | |||
| + | ==== Échec systématique de la validation ==== | ||
| + | |||
| + | Lors du traitement du formulaire dans la vue, celui-ci est systématiquement considéré comme invalide. | ||
| + | |||
| + | |||
| + | Lorsqu' | ||
| + | <code html> | ||
| + | <form method=" | ||
| + | {{ form.csrf_token }} | ||
| + | | ||
| + | <!-- vos autres champs ici --> | ||
| + | |||
| + | <input type=" | ||
| + | </ | ||
| + | </ | ||
| ===== Références ===== | ===== Références ===== | ||