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 amountWidok 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.
Wyzwanie
ŚredniOdrzucaj zgłoszenia RSVP na wydarzenie, na które nie ma już miejsc, komunikatem Sorry, this event is full.:
- Przekaż wydarzenie do
RSVPFormjako argument nazwanyeventi 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_detailtworzy 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"]
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