Acara Lengkap
Termasuk bagian Formulir dalam perjalanan Django di Coddy. Pelajaran 17 dari 20.
Pottery Class memiliki 2 tempat dan 2 tamu, tetapi form-nya masih menerima lebih banyak. Aturannya harus ada di form, tetapi hanya view yang tahu untuk event mana form tersebut digunakan.
Form adalah class, jadi form bisa menerima argumen tambahan. Teruskan argumenmu sebagai kata kunci di __init__, simpan di self, lalu teruskan sisanya ke __init__ milik Django. Form bid yang membutuhkan item lelang:
class BidForm(forms.Form):
amount = forms.IntegerField()
def __init__(self, *args, item=None, **kwargs):
super().__init__(*args, **kwargs)
self.item = item
def clean_amount(self):
amount = self.cleaned_data["amount"]
if amount <= self.item.top_bid:
raise forms.ValidationError("Bid more than the top bid.")
return amountView meneruskan item setiap kali membuat form: BidForm(request.POST, item=item). Menyertakan item dalam signature membuatnya tidak masuk ke **kwargs; form Django tidak mengenalinya dan akan memunculkan TypeError.
Tantangan
SedangTolak RSVP untuk acara yang sudah penuh dengan Sorry, this event is full.:
- Berikan acara kepada
RSVPFormsebagai argumen kata kuncievent, lalu gunakan acara itu untuk memeriksa seluruh formulir. - Acara yang masih memiliki satu tempat kosong tetap menerima satu tamu lagi.
- Teruskan acara setiap kali
event_detailmembuat formulir.
Tekan Jalankan, lalu RSVP untuk Pottery Class.
Coba sendiri
import datetime
from django import forms
from .models import RSVP, Event
class EventForm(forms.ModelForm):
class Meta:
model = Event
fields = ["title", "date", "end_date", "place", "description", "capacity"]
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
def clean(self):
cleaned_data = super().clean()
date = cleaned_data.get("date")
end_date = cleaned_data.get("end_date")
if date and end_date and end_date < date:
raise forms.ValidationError("The event cannot end before it starts.")
return cleaned_data
class RSVPForm(forms.ModelForm):
class Meta:
model = RSVP
fields = ["name", "email"]
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Formulir
Latihan sendiri: Playground Django