Zwei Felder überprüfen
Teil des Abschnitts Formulare der Django-Journey von Coddy. Lektion 11 von 20.
Die Winter-Buchmesse dauert drei Tage, und ein Enddatum darf nicht vor dem Startdatum liegen. Eine clean_<field>-Methode prüft ein einzelnes Feld, daher gehört eine Regel für mehrere Felder in clean(), die nach den eigenen Prüfungen aller Felder ausgeführt wird. Ein Buchungsformular, bei dem eine Gruppe mit mehr als 6 Personen eine Telefonnummer angeben muss:
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_dataEin Feld, bei dem die Prüfung fehlgeschlagen ist, fehlt in cleaned_data, und ein leeres optionales Datumsfeld ist None. Verwende daher .get() zum Auslesen und vergleiche nur, wenn beide Werte vorhanden sind.
Ein in clean() ausgelöster Fehler betrifft das gesamte Formular, daher wird er von der Feldschleife nicht angezeigt. Das übernimmt {{ form.non_field_errors }}.
Aufgabe
MittelVeranstaltungen erhalten ein Enddatum.
- Füge in
events/forms.pyzuEventFormein optionales Datumsfeldend_datehinzu. Schreibeclean(): Wenn beide Datumsangaben vorhanden sind und das Enddatum vor dem Startdatum liegt, löseThe event cannot end before it starts.aus. Lies die Datumsangaben mit.get()aus. - Speichere in
new_eventauchend_date. - Zeige in
new_event.htmlform.non_field_errorsoberhalb der Schleife an.
Lege das Ende vor den Anfang: Du siehst diese Meldung.
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