Acara Lengkap
Termasuk bagian Formulir dalam perjalanan Django di Coddy. Pelajaran 17 dari 20.
Kelas Pottery memiliki 2 tempat dan 2 tamu, tetapi formulirnya masih menerima lebih banyak tamu. Aturannya harus ada di formulir, tetapi hanya view yang tahu untuk acara mana formulir itu digunakan.
Formulir adalah class Python, jadi kamu bisa memberinya __init__ sendiri. Terima nilai tambahan sebagai argumen kata kunci, simpan pada self, lalu teruskan sisanya ke super().__init__(). Formulir penawaran yang memerlukan barang 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 barang setiap kali membuat formulir: BidForm(request.POST, item=item). Menamai item dalam tanda tangan fungsi membuatnya tidak masuk ke **kwargs; formulir Django tidak mengenalinya dan akan memunculkan TypeError.
Tantangan
SedangAcara yang penuh menolak RSVP.
- Di
events/forms.py, tambahkan__init__keRSVPFormyang menyimpan argumen kata kuncieventpadaself.eventdan meneruskan sisanya kesuper().__init__. - Di
clean(), saat tamu memenuhicapacity, munculkanSorry, this event is full.Satu tempat yang tersisa masih dapat diisi oleh seorang tamu. - Di
event_detail, teruskaneventke kedua pemanggilanRSVPForm.
Daftar hadir untuk Pottery Class: kamu melihat Sorry, this event is full.
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