Intermédiaire
🧠 Fondamentaux
20 XP
0 personnes ont réussi
Formulaire avec choix et champs optionnels
Les formulaires Django offrent de nombreux types de champs specialises. Voici les plus utiles :
ChoiceField affiche une liste deroulante :
COULEURS = [('rouge', 'Rouge'), ('bleu', 'Bleu'), ('vert', 'Vert')]
couleur = forms.ChoiceField(choices=COULEURS)
BooleanField affiche une case a cocher :
accepte = forms.BooleanField(required=False)
Le paramètre required=False rend un champ optionnel. Par défaut, tous les champs sont obligatoires.
DecimalField pour les montants avec precision :
montant = forms.DecimalField(max_digits=10, decimal_places=2)
Crée un formulaire EventRegistrationForm avec :
- name : CharField, max 100
- email : EmailField
- event_type : ChoiceField avec les choix [('conference', 'Conference'), ('workshop', 'Atelier'), ('meetup', 'Meetup'), ('webinar', 'Webinaire')]
- nb_guests : IntegerField, min_value=0, max_value=5, required=False (nombre d'accompagnants)
- dietary_restrictions : CharField, max 200, required=False (restrictions alimentaires)
- accepts_terms : BooleanField (doit etre coche, donc required=True par défaut)
Ajoute une méthode clean_nb_guests qui retourne 0 si la valeur est None (car le champ est optionnel).
Exemple :
form = EventRegistrationForm(data={
'name': 'Alice', 'email': 'a@b.com',
'event_type': 'conference', 'accepts_terms': True
})
form.is_valid() vaut True
form.cleaned_data['nb_guests'] vaut 0
Tests (4/5)
Formulaire valide minimal
form = EventRegistrationForm(data={'name': 'Alice', 'email': 'a@b.com', 'event_type': 'conference', 'accepts_terms': True})
assert form.is_valid() == True
nb_guests défaut 0
form = EventRegistrationForm(data={'name': 'Alice', 'email': 'a@b.com', 'event_type': 'workshop', 'accepts_terms': True})
form.is_valid()
assert form.cleaned_data['nb_guests'] == 0
event_type invalide
form = EventRegistrationForm(data={'name': 'Alice', 'email': 'a@b.com', 'event_type': 'fete', 'accepts_terms': True})
assert form.is_valid() == False
assert 'event_type' in form.errors
accepts_terms obligatoire
form = EventRegistrationForm(data={'name': 'Alice', 'email': 'a@b.com', 'event_type': 'meetup'})
assert form.is_valid() == False
assert 'accepts_terms' in form.errors
+ 0 tests cachés
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
class EventRegistrationForm(forms.Form):
EVENT_CHOICES = [
('conference', 'Conference'),
('workshop', 'Atelier'),
('meetup', 'Meetup'),
('webinar', 'Webinaire'),
]
name = forms.CharField(max_length=100)
email = forms.EmailField()
event_type = forms.ChoiceField(choices=EVENT_CHOICES)
nb_guests = forms.IntegerField(min_value=0, max_value=5, required=False)
dietary_restrictions = forms.CharField(max_length=200, required=False)
accepts_terms = forms.BooleanField()
def clean_nb_guests(self):
value = self.cleaned_data.get('nb_guests')
if value is None:
return 0
return value
solution.py