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_dataEin 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.
Aufgabe
Mittel- Füge
end_datenachdatezuEventFormhinzu: 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_dateinnew_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
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Formulare
2Django-Formulare
Ein Django-FormularEin Formular erstellenÜbe selbstständig: Django-Playground