- A propos de la bibliothèque WTForms
- Fonctionnalités principales de la bibliothèque WTForms
- Utilisation de base de la bibliothèque WTForms
- Principaux types de champs courants
- Validateurs intégrés
- Rendu des formulaires dans les templates
- WTForms avec Django - Exemple Complet
- Méthodes et attributs principaux de WTForms
1. A propos de la bibliothèque WTForms
WTForms est une bibliothèque Python flexible pour la validation et le rendu de formulaires dans le développement web. Elle est couramment utilisée avec des frameworks comme Flask et Django pour gérer la création, la validation et le traitement des formulaires. L'usage de la bibliothèque WTForms simplifie grandement la gestion des formulaires en Python tout en offrant une sécurité et une flexibilité importantes.
2. Fonctionnalités principales de la bibliothèque WTForms
- Définition de formulaires via des classes Python
- Validation des données
- Protection contre les attaques CSRF
- Support de l'internationalisation (i18n)
- Large gamme de types de champs
3. Utilisation de base de la bibliothèque WTForms
Installation
1 |
pip install WTForms |
Création d'un formulaire simple
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from wtforms import Form, StringField, PasswordField, validators class FormulaireInscription(Form): nom_utilisateur = StringField('Nom d\'utilisateur', [ validators.Length(min=4, max=25), validators.DataRequired(message='Ce champ est obligatoire') ]) email = StringField('Adresse email', [ validators.Length(min=6, max=35), validators.Email(message='Adresse email invalide') ]) mot_de_passe = PasswordField('Mot de passe', [ validators.DataRequired(message='Ce champ est obligatoire'), validators.EqualTo('confirmation', message='Les mots de passe doivent correspondre') ]) confirmation = PasswordField('Confirmez le mot de passe') |
Utilisation avec Flask
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from flask import Flask, render_template, request from forms import FormulaireInscription app = Flask(__name__) app.secret_key = 'votre-cle-secrete' @app.route('/inscription', methods=['GET', 'POST']) def inscription(): form = FormulaireInscription(request.form) if request.method == 'POST' and form.validate(): # Traitement des données du formulaire return 'Inscription réussie !' return render_template('inscription.html', form=form) |
4. Principaux types de champs courants
- StringField : Champ texte
- PasswordField : Champ mot de passe
- TextAreaField : Zone de texte multiligne
- IntegerField : Nombre entier
- FloatField : Nombre à virgule flottante
- BooleanField : Case à cocher
- RadioField : Boutons radio
- SelectField : Menu déroulant
- FileField : Téléchargement de fichier
- DateField : Date
5. Validateurs intégrés
WTForms inclut plusieurs validateurs prédéfinis:
- DataRequired() : Champ obligatoire
- Email() : Format d'email valide
- Length(min, max) : Longueur du texte
- EqualTo(nom_du_champ) : Doit correspondre à un autre champ
- NumberRange(min, max) : Doit être dans un intervalle
- Regexp(regex) : Doit correspondre à une expression régulière
6. Rendu des formulaires dans les templates
Exemple avec Jinja2 (Flask):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<form method="POST" action="/inscription"> {{ form.hidden_tag() }} <div> {{ form.nom_utilisateur.label }} {{ form.nom_utilisateur() }} {% for error in form.nom_utilisateur.errors %} <span style="color: red;">{{ error }}</span> {% endfor %} </div> <div> {{ form.mot_de_passe.label }} {{ form.mot_de_passe() }} {% for error in form.mot_de_passe.errors %} <span style="color: red;">{{ error }}</span> {% endfor %} </div> <button type="submit">S'inscrire</button> </form> |
7. WTForms avec Django - Exemple Complet
Même si Django a son propre système de formulaires, vous pouvez utiliser WTForms avec Django si vous préférez ses fonctionnalités. Voici un exemple complet:
Installation
1 |
pip install WTForms Django |
7.1 Création du formulaire
Dans un fichier forms.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
from wtforms import Form, StringField, PasswordField, validators from wtforms.fields import EmailField, DateField class InscriptionForm(Form): username = StringField("Nom d'utilisateur", [ validators.Length(min=4, max=25), validators.DataRequired(message="Ce champ est obligatoire") ]) email = EmailField("Email", [ validators.Email(message="Email invalide"), validators.DataRequired() ]) password = PasswordField("Mot de passe", [ validators.DataRequired(), validators.EqualTo('confirm', message="Les mots de passe doivent correspondre") ]) confirm = PasswordField("Confirmez le mot de passe") date_naissance = DateField("Date de naissance", format='%Y-%m-%d') |
7.2 Vue Django
Dans views.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
from django.shortcuts import render, redirect from .forms import InscriptionForm from django.views.decorators.csrf import csrf_protect @csrf_protect def inscription(request): if request.method == 'POST': form = InscriptionForm(request.POST) if form.validate(): # Traiter les données du formulaire username = form.username.data email = form.email.data password = form.password.data # Ici vous pourriez enregistrer en base de données # User.objects.create(username=username, email=email, password=password) return redirect('success') else: form = InscriptionForm() return render(request, 'inscription.html', {'form': form}) def success(request): return render(request, 'success.html') |
7.3 Template HTML
Dans templates/inscription.html:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
<!DOCTYPE html> <html> <head> <title>Inscription</title> </head> <body> <h2>Formulaire d'inscription</h2> <form method="post"> {% csrf_token %} <div> {{ form.username.label }} {{ form.username() }} {% if form.username.errors %} <ul> {% for error in form.username.errors %} <li style="color: red;">{{ error }}</li> {% endfor %} </ul> {% endif %} </div> <div> {{ form.email.label }} {{ form.email() }} {% if form.email.errors %} <ul> {% for error in form.email.errors %} <li style="color: red;">{{ error }}</li> {% endfor %} </ul> {% endif %} </div> <div> {{ form.password.label }} {{ form.password() }} {% if form.password.errors %} <ul> {% for error in form.password.errors %} <li style="color: red;">{{ error }}</li> {% endfor %} </ul> {% endif %} </div> <div> {{ form.confirm.label }} {{ form.confirm() }} </div> <div> {{ form.date_naissance.label }} {{ form.date_naissance() }} </div> <button type="submit">S'inscrire</button> </form> </body> </html> |
7.4 URLs
Dans urls.py:
1 2 3 4 5 6 7 |
from django.urls import path from . import views urlpatterns = [ path('inscription/', views.inscription, name='inscription'), path('success/', views.success, name='success'), ] |
Points importants avec Django
- CSRF Protection : N'oubliez pas le tag {% csrf_token %} dans vos templates
- Gestion des requêtes : WTForms utilise request.POST directement
- Validation : La méthode validate() fait toute la validation
- Rendu des erreurs : Affichez les erreurs dans le template comme montré
Avantages par rapport aux forms Django
- Syntaxe : Syntaxe souvent plus concise
- organisation: Meilleure séparation entre validation et traitement
- Validateurs prédéfinis : Fonctionnalités supplémentaires comme les validateurs prédéfinis
- Facilité d'usage : Plus facile à utiliser pour des cas complexes
Cependant, pour une intégration plus profonde avec Django (comme l'enregistrement automatique des models), les formulaires natifs de Django restent souvent préférables.
8. Méthodes et attributs principaux de WTForms
WTForms est doté de nombreuses méthodes permettant d'améliorer les formulaires. Ces méthodes fournissent une interface complète pour la gestion des formulaires, de la validation des données au rendu HTML.. Voici les principales méthodes et fonctionnalités associées à WTForms:
8.1 Méthodes principales de la classe Form
- Constructeur: __init__(formdata=None, obj=None, prefix='', **kwargs). Constructeur pour initialiser le formulaire
- formdata: données du formulaire (généralement request.form en Flask)
- obj: objet Python pour pré-remplir le formulaire
- prefix: préfixe pour les noms de champs
- validate() : Valide tous les champs du formulaire. Retourne True si la validation réussit pour tous les champs
- validate_on_submit() (Flask-WTF) : Combine is_submitted() et validate(). Retourne True si le formulaire a été soumis et est valide
- populate_obj(obj) : Remplit un objet avec les données du formulaire. Utile pour mettre à jour des modèles de base de données
- process(formdata=None, obj=None, **kwargs) : Traite les données du formulaire
8.2 Méthodes utiles des champs (Field)
- __call__(**kwargs): Rend le champ en HTML. Peut recevoir des attributs HTML supplémentaires
- validate(form, extra_validators=()) : Valide le champ spécifique
- process(formdata, data) : Traite les données pour ce champ spécifique
8.3 Méthodes pour la gestion des données
- data (propriété) : Dictionnaire contenant toutes les données du formulaire
- errors (propriété) : Dictionnaire des erreurs de validation par champ
- meta (attribut) : Contient la configuration du formulaire
8.4 Méthodes pour le rendu HTML
- hidden_tag() : Génère tous les champs cachés du formulaire (y compris CSRF)
- label(field_id, **kwargs) : Génère le label HTML pour un champ
8.5 Méthodes de validation personnalisée
Création de validateurs personnalisés:
from wtforms.validators import ValidationError
1 2 3 4 5 6 |
def mon_validateur(form, field): if field.data != 'valeur_attendue': raise ValidationError('Message d\'erreur') class MonFormulaire(Form): mon_champ = StringField('Mon Champ', [mon_validateur]) |
Méthodes pour les formulaires dynamiques
- append_entry() (pour FieldList) : Ajoute une nouvelle entrée à une liste de champs
- remove_entry(index) (pour FieldList) : Supprime une entrée spécifique
8.6 Exemple d'utilisation complète
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
form = MonFormulaire(request.form) if request.method == 'POST' and form.validate(): # Accès aux données validées username = form.username.data email = form.email.data # Remplissage d'un objet user = User() form.populate_obj(user) user.save() return redirect('/success') # Affichage des erreurs if form.errors: print("Erreurs:", form.errors) # Rendu dans un template return render_template('form.html', form=form) |
Younes Derfoufi
CRMEF OUJDA