فعالية كاملة
جزء من قسم النماذج في رحلة Django على Coddy. الدرس 17 من 20.
يحتوي درس الفخار على مكانين وضيفين، ومع ذلك لا يزال النموذج يقبل عددًا أكبر. ينبغي أن تكون القاعدة في النموذج، لكن العرض وحده يعرف الفعالية التي يتبعها النموذج.
النموذج فئة في Python، لذا يمكنك تعريف __init__ خاص بك. خذ القيمة الإضافية كوسيط مسمى، واحتفظ بها في self، ومرّر البقية إلى super().__init__(). نموذج مزايدة يحتاج إلى عنصر المزاد:
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.
التحدي
متوسطترفض الفعاليات المكتملة طلبات تأكيد الحضور.
- في
events/forms.py، أضف إلىRSVPFormدالة__init__تحتفظ بالوسيط المسمّىeventفيself.eventوتمرّر بقية الوسائط إلىsuper().__init__. - في
clean()الخاصة بها، عندما يمتلئ عدد الضيوف حتىcapacity، ارفع الخطأSorry, this event is full.. لا يزال هناك مقعد واحد متاح لاستقبال ضيف. - في
event_detail، مرّرeventإلى استدعاءَيRSVPForm.
عند تأكيد الحضور إلى صف الفخار، تظهر لك الرسالة Sorry, this event is full.
جرّب بنفسك
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"]
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس النماذج
تدرّب بنفسك: Playground لـ Django