İ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_dataDoğ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.
Görev
OrtaEtkinliklere bir bitiş tarihi ekleyin.
events/forms.pydosyasında,EventFormöğesine isteğe bağlı birend_datetarih alanı ekleyin.clean()metodunu yazın: her iki tarih de mevcutsa ve bitiş tarihi başlangıç tarihinden önceyseThe event cannot end before it starts.hatasını verin. Tarihleri.get()ile okuyun.new_eventiçindeend_datedeğerini de kaydedin.new_event.htmldosyasında, döngünün üstüneform.non_field_errorsekleyin.
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
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
2Django Formları
Bir Django FormuForm ÇizimiKendi başına pratik yap: Django playground