Menu
CoddyTech

Zwei Felder überprüfen

Teil des Abschnitts Formulare der Django-Journey von Coddy. Lektion 11 von 20.

Die Winter-Buchmesse dauert drei Tage, und das Ende darf nicht vor ihrem Beginn liegen. Eine clean_<field>-Methode prüft ein einzelnes Feld, daher gehört eine Regel für mehrere Felder in clean(), das ausgeführt wird, nachdem jedes Feld seine eigenen Prüfungen durchlaufen hat. Ein Buchungsformular, bei dem Gruppen mit mehr als 6 Personen eine Telefonnummer angeben müssen:

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

Ein Feld, dessen Prüfung fehlgeschlagen ist, fehlt in cleaned_data, und ein leeres optionales Datumsfeld hat den Wert None. Verwende daher .get() und vergleiche die Werte nur, wenn beide vorhanden sind.

self.add_error() fügt eine Meldung unter einem einzelnen Feld ein. Wird in clean() forms.ValidationError ausgelöst, entsteht ein Fehler für das gesamte Formular, den kein Feld anzeigt: Dafür ist {{ form.non_field_errors }} zuständig.

challenge icon

Aufgabe

Mittel
  • Füge end_date nach date zu EventForm hinzu: ein Datum, das leer sein darf.
  • Weise ein Enddatum vor dem Startdatum mit The event cannot end before it starts. zurück; der Fehler betrifft das gesamte Formular.
  • Speichere end_date in new_event.
  • Zeige die Fehler des gesamten Formulars oberhalb der Felder an.

Klicke auf „Run“ und probiere ein Enddatum vor dem Startdatum aus.

Probier es selbst

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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Formulare

Übe selbstständig: Django-Playground