Menu
CoddyTech

Memeriksa Dua Bidang

Termasuk bagian Formulir dalam perjalanan Django di Coddy. Pelajaran 11 dari 20.

Pameran Buku Musim Dingin berlangsung selama tiga hari, dan tanggal akhir tidak boleh sebelum tanggal mulainya. Sebuah method clean_<field> memeriksa satu field, jadi aturan yang melibatkan beberapa field ditulis di clean(), yang dijalankan setelah pemeriksaan masing-masing field. Contoh formulir pemesanan yang mengharuskan grup dengan jumlah lebih dari 6 orang mencantumkan nomor telepon:

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

Field yang gagal diperiksa tidak ada di cleaned_data, dan tanggal opsional yang kosong bernilai None, jadi baca dengan .get() dan bandingkan hanya jika kedua nilai tersedia.

self.add_error() menampilkan pesan di bawah satu field. Menaikkan forms.ValidationError di clean() membuat error untuk seluruh formulir, yang tidak ditampilkan oleh field mana pun: {{ form.non_field_errors }} yang menampilkannya.

challenge icon

Tantangan

Sedang
  • Tambahkan end_date ke EventForm setelah date: tanggal yang boleh kosong.
  • Tolak tanggal akhir yang lebih awal daripada tanggal mulai dengan The event cannot end before it starts., sebagai error untuk seluruh formulir.
  • Simpan end_date di new_event.
  • Tampilkan error seluruh formulir di atas kolom.

Tekan Jalankan dan coba tanggal akhir yang lebih awal daripada tanggal mulai.

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Formulir

Latihan sendiri: Playground Django