Dans Django, deux principales classes de formulaires sont proposées : forms.Form
et forms.ModelForm
. Dans cet article, nous allons expliquer les différences entre ces deux classes et dans quels cas choisir l'une ou l'autre.
1. Aperçu de forms.Form
et forms.ModelForm

1.1 Qu'est-ce que forms.Form
?
- Classe de formulaire indépendante : fonctionne indépendamment du modèle Django et permet de définir manuellement les données souhaitées.
- Usage principal : utilisé pour valider simplement les entrées utilisateurs ou traiter des données qui ne sont pas directement liées à un modèle.
Exemple : Formulaire de feedback utilisateur
from django import forms
class FeedbackForm(forms.Form):
name = forms.CharField(max_length=50, label="Votre Nom")
email = forms.EmailField(label="Votre Email")
message = forms.CharField(widget=forms.Textarea, label="Votre Feedback")
1.2 Qu'est-ce que forms.ModelForm
?
- Classe de formulaire liée à un modèle : associée directement à un modèle Django, l'interaction avec la base de données est automatisée.
- Usage principal : utilisé pour créer ou mettre à jour des instances de modèle, ou pour recueillir des données à stocker dans la base de données.
Exemple : Formulaire de création d'article de blog
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'content']
2. Comparaison des principales différences
Critère | forms.Form | forms.ModelForm |
---|---|---|
Association avec le modèle | Indépendant du modèle | Directement associé au modèle |
Traitement des données | Validation des données puis sauvegarde manuelle | Sauvegarde automatique des données (form.save() méthode) |
Définition des champs | Tous les champs définis explicitement | Les champs du modèle sont automatiquement convertis en champs de formulaire |
Usage | Traitement de données indépendantes ou formulaires d'entrée utilisateur | Formulaires associés à des opérations sur la base de données |
Flexibilité | Configuration libre des champs | Dépendant des champs du modèle |
3. Cas d'utilisation
3.1 Cas d'utilisation de forms.Form
- Traitement de données indépendantes du modèle : exemple : formulaire de recherche, formulaire de connexion, formulaire de réinitialisation de mot de passe.
Exemple de formulaire de recherche
class SearchForm(forms.Form):
query = forms.CharField(max_length=100, label="Recherche")
- Traitement complexe des entrées utilisateur : exemple : lorsque les champs d'entrée ne sont pas directement stockés dans un modèle.
Exemple de formulaire de changement de mot de passe
class PasswordChangeForm(forms.Form):
old_password = forms.CharField(widget=forms.PasswordInput, label="Ancien Mot de Passe")
new_password = forms.CharField(widget=forms.PasswordInput, label="Nouveau Mot de Passe")
confirm_password = forms.CharField(widget=forms.PasswordInput, label="Confirmer le Mot de Passe")
def clean(self):
cleaned_data = super().clean()
new_password = cleaned_data.get("new_password")
confirm_password = cleaned_data.get("confirm_password")
if new_password != confirm_password:
raise forms.ValidationError("Les mots de passe ne correspondent pas.")
3.2 Cas d'utilisation de forms.ModelForm
- Création et mise à jour des objets modèles : exemple : rédaction d'un article de blog, rédaction de commentaires, modification d'un profil utilisateur.
Exemple de formulaire de commentaire
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ['author', 'text']
- Entrée de données basée sur un modèle : exemple : lors de la modification de données existantes ou de la sauvegarde de données dans la base de données.
4. Comparaison du fonctionnement des formulaires
4.1 Validation des données
forms.Form
: définit manuellement les champs et la logique de validation.forms.ModelForm
: utilise automatiquement les règles de validation définies pour les champs du modèle.
Exemple : Validation des champs du modèle
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ['name', 'price']
- Le champ
price
valide automatiquement les contraintes définies dans le modèle (max_digits
,decimal_places
).
4.2 Sauvegarde des données
forms.Form
: traite les données en utilisantcleaned_data
.forms.ModelForm
: sauvegarde automatiquement les données avec la méthodesave()
.
Exemple de sauvegarde de données avec forms.Form
form = FeedbackForm(request.POST)
if form.is_valid():
feedback = Feedback(
name=form.cleaned_data['name'],
email=form.cleaned_data['email'],
message=form.cleaned_data['message']
)
feedback.save()
Exemple de sauvegarde de données avec forms.ModelForm
form = PostForm(request.POST)
if form.is_valid():
form.save()
5. Quel formulaire choisir ?
- Travail associé au modèle : si les interactions doivent se faire directement avec la base de données, il est préférable d'utiliser
forms.ModelForm
. - Travail indépendant du modèle : utilisez
forms.Form
si vous avez besoin de valider des données de manière indépendante ou de traiter des entrées utilisateur.
Conclusion
forms.Form
et forms.ModelForm
sont deux outils puissants pour gérer les entrées et la validation des données dans Django. Les deux classes ont des usages et des caractéristiques différents, il est donc important de choisir le formulaire adéquat en fonction de la situation. Dans le prochain article, nous examinerons en détail les champs de formulaire et les widgets.
Add a New Comment