İ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_dataDenetimden 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.
Görev
Ortadate'ten sonraEventForm'aend_dateekle: 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'inew_eventiç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
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