Menu
CoddyTech

İki Alanı Denetleme

Coddy'nin Django Journey'sinin Formlar bölümünün bir parçası. Ders 11 / 20.

Kış Kitap Fuarı üç gün sürer ve bitiş tarihi başlangıç tarihinden önce olamaz. clean_<field> yöntemi tek bir alanı inceler; bu nedenle alanlar arası bir kural, her alanın kendi denetimlerinden sonra çalışan clean() yöntemine yazılır. 6 kişiden büyük grupların telefon numarası vermesi gereken bir rezervasyon formu:

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

Denetimden geçemeyen bir alan cleaned_data içinde bulunmaz ve boş bir isteğe bağlı tarih None olur; bu nedenle .get() ile okuyun ve yalnızca her iki değer de mevcutsa karşılaştırın.

self.add_error(), bir alanın altında bir hata mesajı gösterir. clean() içinde forms.ValidationError fırlatmak, bütün form için bir hata oluşturur; bu hatayı hiçbir alan göstermez: bunu {{ form.non_field_errors }} yapar.

challenge icon

Görev

Orta
  • date'ten sonra EventForm'a end_date ekle: boş bırakılabilen bir tarih.
  • Başlangıçtan önce bitişi, tüm formun hatası olan The event cannot end before it starts. mesajıyla reddet.
  • end_date'i new_event içinde kaydet.
  • Tüm formun hatalarını alanların üzerinde göster.

Run'a bas ve başlangıçtan önce bir bitiş dene.

Kendin dene

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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Formlar bölümündeki tüm dersler

Kendi başına pratik yap: Django playground