Menu
CoddyTech

Sprawdzanie dwóch pól

Część sekcji Formularze ścieżki Django w Coddy. Lekcja 11 z 20.

Zimowe Targi Książki trwają trzy dni, a data końcowa nie może przypadać przed datą początkową. Metoda clean_<field> sprawdza jedno pole, więc reguła dotycząca kilku pól należy do clean(), która jest uruchamiana po sprawdzeniu każdego pola. Formularz rezerwacji, w którym grupa licząca ponad 6 osób musi podać numer telefonu:

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

Nieudane pole nie znajduje się w cleaned_data, a pusta opcjonalna data ma wartość None, dlatego odczytuj dane za pomocą .get() i porównuj wartości tylko wtedy, gdy dostępne są obie.

self.add_error() umieszcza komunikat pod jednym polem. Zgłoszenie wyjątku forms.ValidationError w clean() powoduje błąd całego formularza, którego nie wyświetla żadne pole — robi to {{ form.non_field_errors }}.

challenge icon

Wyzwanie

Średni
  • Dodaj end_date do EventForm po date: datę, która może być pusta.
  • Odrzuć datę końcową wcześniejszą niż data początkowa za pomocą The event cannot end before it starts. — błędu dotyczącego całego formularza.
  • Zapisz end_date w new_event.
  • Pokaż błędy całego formularza nad polami.

Naciśnij Run i spróbuj ustawić datę końcową wcześniejszą niż początkowa.

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Formularze

Poćwicz samodzielnie: Edytor online Django