Menu
CoddyTech

Wydarzenie bez wolnych miejsc

Część sekcji Formularze ścieżki Django w Coddy. Lekcja 17 z 20.

Klasa garncarstwa ma 2 miejsca i 2 gości, a mimo to jej formularz nadal przyjmuje więcej zgłoszeń. Ta reguła należy do formularza, ale tylko widok wie, którego wydarzenia dotyczy formularz.

Formularz jest klasą, więc może przyjmować więcej argumentów. Przekaż swój jako argument nazwany w __init__, zachowaj go w self i przekaż pozostałe argumenty do __init__ Django. Formularz oferty, który potrzebuje przedmiotu wystawionego na aukcję:

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

Widok przekazuje przedmiot za każdym razem, gdy tworzy formularz: BidForm(request.POST, item=item). Umieszczenie item w sygnaturze sprawia, że nie trafia on do **kwargs; formularz Django go nie zna i zgłosiłby TypeError.

challenge icon

Wyzwanie

Średni

Odrzucaj zgłoszenia RSVP na wydarzenie, na które nie ma już miejsc, komunikatem Sorry, this event is full.:

  • Przekaż wydarzenie do RSVPForm jako argument nazwany event i użyj go do sprawdzenia całego formularza.
  • Wydarzenie, na które zostało jedno wolne miejsce, nadal przyjmuje jeszcze jednego gościa.
  • Przekaż wydarzenie w każdym miejscu, w którym event_detail tworzy formularz.

Naciśnij Run i zgłoś udział w zajęciach garncarskich.

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Formularze

Poćwicz samodzielnie: Edytor online Django