Menu
CoddyTech

Sprawdzanie dwóch pól

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

Zimowy Targ Książki trwa trzy dni, a koniec nie może przypadać przed jego rozpoczęciem. Metoda clean_<field> sprawdza jedno pole, więc reguła dotycząca wielu pól powinna znaleźć się w clean(), która uruchamia się po sprawdzeniu każdego pola. Formularz rezerwacji, w którym grupa licząca więcej niż 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:
        raise forms.ValidationError("Groups over 6 need a phone number.")
    return cleaned_data

Pola, które nie przeszło sprawdzania, brakuje w cleaned_data, a pusta opcjonalna data ma wartość None, dlatego odczytuj dane za pomocą .get() i porównuj wartości tylko wtedy, gdy obie są dostępne.

Błąd zgłoszony w clean() dotyczy całego formularza, więc pętla pól go nie wyświetla. Wyświetla go {{ form.non_field_errors }}.

challenge icon

Wyzwanie

Średni

Wydarzenia otrzymują datę zakończenia.

  1. W events/forms.py dodaj opcjonalne pole daty end_date do EventForm. Napisz clean(): gdy podano obie daty i data zakończenia jest wcześniejsza, zgłoś The event cannot end before it starts.. Odczytaj daty za pomocą .get().
  2. W new_event zapisuj również end_date.
  3. W new_event.html umieść form.non_field_errors nad pętlą.

Ustaw datę zakończenia przed datą rozpoczęcia: zobaczysz ten komunikat.

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