Intermédiaire
🧠 Fondamentaux
20 XP
0 personnes ont réussi
Formulaire avec validation personnalisee
Django permet d'ajouter des validations personnalisees a un formulaire. Il y a deux types :
1. Validation par champ avec clean_<nom_du_champ>(self) :
class MonForm(forms.Form): age = forms.IntegerField()
def clean_age(self): age = self.cleaned_data['age'] if age < 18: raise forms.ValidationError("Tu dois avoir au moins 18 ans.") return age
La méthode clean_age est appelee automatiquement apres la validation standard du champ. Elle doit retourner la valeur nettoyee ou lever une ValidationError.
2. Validation croisee avec clean(self) pour valider plusieurs champs ensemble :
def clean(self): cleaned_data = super().clean() mdp = cleaned_data.get('password') confirm = cleaned_data.get('confirm_password') if mdp and confirm and mdp != confirm: raise forms.ValidationError("Les mots de passe ne correspondent pas.") return cleaned_data
Crée un formulaire RegistrationForm avec : - username : CharField, min 3 max 30 - email : EmailField - password : CharField, min 8, widget=forms.PasswordInput - confirm_password : CharField, widget=forms.PasswordInput
Ajoute les validations : - clean_username : le username ne doit contenir que des lettres, chiffres et underscores. Sinon, leve ValidationError avec "Le nom d'utilisateur ne doit contenir que des lettres, chiffres et underscores." - clean : vérifie que password et confirm_password sont identiques. Sinon, leve ValidationError avec "Les mots de passe ne correspondent pas."
import re
form = RegistrationForm(data={'username': 'alice_42', 'email': 'a@b.com', 'password': 'MonMdp123', 'confirm_password': 'MonMdp123'})
assert form.is_valid() == True
Username invalide
import re
form = RegistrationForm(data={'username': 'alice!@#', 'email': 'a@b.com', 'password': 'MonMdp123', 'confirm_password': 'MonMdp123'})
assert form.is_valid() == False
assert 'username' in form.errors
Mots de passe differents
import re
form = RegistrationForm(data={'username': 'alice', 'email': 'a@b.com', 'password': 'MonMdp123', 'confirm_password': 'Autre456'})
assert form.is_valid() == False
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
import django
from django.conf import settings
if not settings.configured:
settings.configure(
DATABASES={},
INSTALLED_APPS=['django.contrib.contenttypes'],
DEFAULT_AUTO_FIELD='django.db.models.BigAutoField',
)
django.setup()
from django import forms
import re
class RegistrationForm(forms.Form):
username = forms.CharField(min_length=3, max_length=30)
email = forms.EmailField()
password = forms.CharField(min_length=8, widget=forms.PasswordInput)
confirm_password = forms.CharField(widget=forms.PasswordInput)
def clean_username(self):
username = self.cleaned_data['username']
if not re.match(r'^[a-zA-Z0-9_]+$', username):
raise forms.ValidationError("Le nom d'utilisateur ne doit contenir que des lettres, chiffres et underscores.")
return username
def clean(self):
cleaned_data = super().clean()
password = cleaned_data.get('password')
confirm = cleaned_data.get('confirm_password')
if password and confirm and password != confirm:
raise forms.ValidationError("Les mots de passe ne correspondent pas.")
return cleaned_data