فعالية كاملة
جزء من قسم النماذج في رحلة Django على Coddy. الدرس 17 من 20.
يحتوي صف الفخار على مكانين وضيفين، ومع ذلك لا يزال نموذجه يقبل عددًا أكبر. يجب أن تكون القاعدة في النموذج، لكن العرض وحده يعرف الحدث الذي يخصه النموذج.
النموذج فئة، لذا يمكنه قبول مزيد من الوسائط. مرّر نموذجك كوسيط مسمّى في __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.
التحدي
متوسطارفض طلبات تأكيد الحضور لفعالية مكتملة باستخدام Sorry, this event is full.:
- مرّر الفعالية إلى
RSVPFormكوسيطة مفتاحيةevent، واستخدمها للتحقق من النموذج بأكمله. - الفعالية التي بقي فيها مقعد واحد تستقبل ضيفًا إضافيًا واحدًا.
- مرّر الفعالية في كل موضع تُنشئ فيه
event_detailالنموذج.
اضغط على تشغيل وأكّد حضورك لدرس الفخار.
جرّب بنفسك
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