Vérifier deux champs
Fait partie de la section Formulaires du Journey Django de Coddy. Leçon 11 sur 20.
La foire du livre d’hiver dure trois jours, et une fin ne doit pas précéder son début. Une méthode clean_<field> examine un champ ; une règle portant sur plusieurs champs va donc dans clean(), qui s’exécute après les vérifications propres à chaque champ. Voici un formulaire de réservation où un groupe de plus de 6 personnes doit laisser un numéro de téléphone :
def clean(self):
cleaned_data = super().clean()
guests = cleaned_data.get("guests")
phone = cleaned_data.get("phone")
if guests and guests > 6 and not phone:
raise forms.ValidationError("Groups over 6 need a phone number.")
return cleaned_dataUn champ dont la validation a échoué est absent de cleaned_data, et une date facultative vide vaut None ; utilisez donc .get() et ne comparez les valeurs que si elles sont toutes les deux présentes.
Une erreur levée dans clean() concerne l’ensemble du formulaire ; la boucle des champs ne l’affiche donc pas. C’est {{ form.non_field_errors }} qui l’affiche.
Défi
MoyenLes événements ont une date de fin.
- Dans
events/forms.py, ajoute un champ de date facultatifend_dateàEventForm. Écrisclean(): lorsque les deux dates sont présentes et que la date de fin précède la date de début, déclencheThe event cannot end before it starts.Récupère les dates avec.get(). - Dans
new_event, enregistre aussiend_date. - Dans
new_event.html, afficheform.non_field_errorsau-dessus de la boucle.
Définis la date de fin avant la date de début : tu vois ce message.
Essayez vous-même
import datetime
from django import forms
class EventForm(forms.Form):
title = forms.CharField(max_length=100)
date = forms.DateField()
place = forms.CharField(max_length=100)
description = forms.CharField(widget=forms.Textarea, required=False)
capacity = forms.IntegerField(min_value=1)
def clean_date(self):
date = self.cleaned_data["date"]
if date < datetime.date.today():
raise forms.ValidationError("The date cannot be in the past.")
return date
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Formulaires
2Formulaires Django
Un formulaire DjangoCréer un formulaire3Formulaires de modèle
Un formulaire de modèleModifier un événementSupprimer un événementMessages de réussiteEntraînez-vous par vous-même : Playground Django