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

Ein 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 }}.

challenge icon

Aufgabe

Mittel

Veranstaltungen erhalten ein Enddatum.

  1. Füge in events/forms.py zu EventForm ein optionales Datumsfeld end_date hinzu. Schreibe clean(): Wenn beide Datumsangaben vorhanden sind und das Enddatum vor dem Startdatum liegt, löse The event cannot end before it starts. aus. Lies die Datumsangaben mit .get() aus.
  2. Speichere in new_event auch end_date.
  3. Zeige in new_event.html form.non_field_errors oberhalb 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
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