Avancé
🧠 Fondamentaux
30 XP
0 personnes ont réussi
Modèle avec choices et validation
Django permet de definir des choix limites pour un champ avec le paramètre choices. C'est utile pour les champs qui ne peuvent prendre que quelques valeurs predefinies, comme un statut ou un type.
Les choices se definissent comme une liste de tuples (valeur_stockee, texte_affiche) :
Pour la validation, Django fournit la méthode clean() que tu peux surcharger dans ton modèle. Elle est appelee automatiquement par les formulaires (mais pas par .save() directement).
Definis un modèle Order avec : - PRIORITY_CHOICES : [('low', 'Basse'), ('medium', 'Moyenne'), ('high', 'Haute'), ('urgent', 'Urgente')] - STATUS_CHOICES : [('draft', 'Brouillon'), ('pending', 'En attente'), ('processing', 'En cours'), ('completed', 'Terminee'), ('cancelled', 'Annulee')] - référence : CharField max 50, unique - customer_name : CharField max 100 - amount : FloatField - priority : CharField max 10, choices PRIORITY_CHOICES, défaut 'medium' - status : CharField max 20, choices STATUS_CHOICES, défaut 'draft'
Ajoute une méthode clean(self) qui leve une ValidationError si : - amount est negatif ou nul : 'Le montant doit etre positif' - référence est vide : 'La référence est obligatoire'
Ajoute aussi les propriétés : - @property is_active : True si status n'est pas 'cancelled' ni 'completed' - méthode can_cancel(self) : retourne True si le status est 'draft' ou 'pending'
Meta avec app_label = 'test'.
Exemple :
valid_choices = [c[0] for c in Order.STATUS_CHOICES] 'draft' in valid_choices vaut True
Tests (5/6)
STATUS_CHOICES defini
choices = [c[0] for c in Order.STATUS_CHOICES]
assert 'draft' in choices and 'cancelled' in choices
PRIORITY_CHOICES defini
choices = [c[0] for c in Order.PRIORITY_CHOICES]
assert 'low' in choices and 'urgent' in choices
status default draft
field = Order._meta.get_field('status')
assert field.default == 'draft'