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ı denetler; bu nedenle alanlar arası bir kural, her alanın kendi denetimleri tamamlandıktan sonra çalışan clean() yöntemine yazılır. 6 kişiden kalabalık bir grubun 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:
        raise forms.ValidationError("Groups over 6 need a phone number.")
    return cleaned_data

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

clean() içinde yükseltilen bir hata formun tamamına aittir; bu nedenle alan döngüsü bu hatayı görüntülemez. {{ form.non_field_errors }} görüntüler.

challenge icon

Görev

Orta

Etkinliklere bir bitiş tarihi ekleyin.

  1. events/forms.py dosyasında, EventForm öğesine isteğe bağlı bir end_date tarih alanı ekleyin. clean() metodunu yazın: her iki tarih de mevcutsa ve bitiş tarihi başlangıç tarihinden önceyse The event cannot end before it starts. hatasını verin. Tarihleri .get() ile okuyun.
  2. new_event içinde end_date değerini de kaydedin.
  3. new_event.html dosyasında, döngünün üstüne form.non_field_errors ekleyin.

Bitiş tarihini başlangıç tarihinden önce ayarlayın: bu mesajı görürsünüz.

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