אירוע מלא
חלק מהיחידה טפסים במסלול ה-Django של Coddy. שיעור 17 מתוך 20.
בכיתת הקרמיקה יש 2 מקומות ו-2 אורחים, ובכל זאת הטופס שלה עדיין מקבל יותר. הכלל שייך לטופס, אבל רק התצוגה יודעת לאיזה אירוע מיועד הטופס.
טופס הוא מחלקה, ולכן הוא יכול לקבל ארגומנטים נוספים. העבירו את שלכם כמילת מפתח אל __init__, שמרו אותו ב-self והעבירו את השאר אל __init__ של Django. טופס הצעת מחיר שזקוק לפריט המכירה הפומבית:
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 amountהתצוגה מעבירה את הפריט בכל פעם שהיא בונה את הטופס: BidForm(request.POST, item=item). ציון item בחתימה מונע ממנו להיכלל ב-**kwargs; טופס Django אינו מכיר אותו ויעלה TypeError.
אתגר
בינונידחה בקשות RSVP לאירוע מלא באמצעות Sorry, this event is full.:
- העבר את האירוע אל
RSVPFormכארגומנט מילת מפתחevent, והשתמש בו בבדיקה של הטופס כולו. - אירוע שנותר בו מקום אחד עדיין יכול לקבל אורח נוסף אחד.
- העבר את האירוע בכל מקום שבו
event_detailיוצר את הטופס.
לחץ על Run ושלח בקשת RSVP לשיעור הקדרות.
נסו בעצמכם
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"]
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה טפסים
תרגלו בעצמכם: Django אונליין