Menu
CoddyTech

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 date de fin ne doit pas précéder la date de début. Une méthode clean_<field> vérifie un seul 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 indiquer 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:
        self.add_error("phone", "Groups over 6 need a phone number.")
    return cleaned_data

Un champ qui a échoué est absent de cleaned_data, et une date facultative vide vaut None ; utilisez donc .get() et faites la comparaison uniquement lorsque les deux valeurs sont présentes.

self.add_error() place un message sous un champ. Lever forms.ValidationError dans clean() crée une erreur pour l’ensemble du formulaire, qui n’est affichée sous aucun champ : c’est {{ form.non_field_errors }} qui l’affiche.

challenge icon

Défi

Moyen
  • Ajoutez end_date à EventForm après date : une date qui peut être vide.
  • Refusez une date de fin antérieure à la date de début avec The event cannot end before it starts., une erreur portant sur l’ensemble du formulaire.
  • Enregistrez end_date dans new_event.
  • Affichez les erreurs de l’ensemble du formulaire au-dessus des champs.

Cliquez sur Exécuter et essayez une date de fin antérieure à la date de début.

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
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Playground Django