Exercices Concepts Web & Django Formulaire avec validation personnalisee
🎉

Bravo!

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."

Exemple :

form = RegistrationForm(data={'username': 'alice_42', 'email': 'a@b.com', 'password': 'MonMdp123', 'confirm_password': 'MonMdp123'})
form.is_valid() vaut True

Tests (3/4)

Formulaire valide
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.py