Menu
CoddyTech

فعالية كاملة

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

challenge icon

التحدي

متوسط

ارفض طلبات تأكيد الحضور لفعالية مكتملة باستخدام 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"]
quiz iconاختبر نفسك

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

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

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