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 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_data

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

challenge icon

Défi

Moyen

Les événements ont une date de fin.

  1. Dans events/forms.py, ajoute un champ de date facultatif end_date à EventForm. Écris clean() : lorsque les deux dates sont présentes et que la date de fin précède la date de début, déclenche The event cannot end before it starts. Récupère les dates avec .get().
  2. Dans new_event, enregistre aussi end_date.
  3. Dans new_event.html, affiche form.non_field_errors au-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
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