Menu
CoddyTech

فعالية كاملة

جزء من قسم النماذج في رحلة 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.

challenge icon

التحدي

متوسط

ترفض الفعاليات المكتملة طلبات تأكيد الحضور.

  1. في events/forms.py، أضف إلى RSVPForm دالة __init__ تحتفظ بالوسيط المسمّى event في self.event وتمرّر بقية الوسائط إلى super().__init__.
  2. في clean() الخاصة بها، عندما يمتلئ عدد الضيوف حتى capacity، ارفع الخطأ Sorry, this event is full.. لا يزال هناك مقعد واحد متاح لاستقبال ضيف.
  3. في 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"]
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس النماذج

تدرّب بنفسك: Playground لـ Django