Ein vollständiges Event
Teil des Abschnitts Formulare der Django-Journey von Coddy. Lektion 17 von 20.
Der Töpferkurs hat 2 Plätze und 2 Gäste, aber sein Formular nimmt trotzdem mehr an. Die Regel gehört ins Formular, aber nur die View weiß, für welche Veranstaltung das Formular bestimmt ist.
Ein Formular ist eine Klasse und kann daher weitere Argumente entgegennehmen. Übergib dein Argument als Schlüsselwortargument in __init__, speichere es in self und übergib die übrigen Argumente an Djangos __init__. Ein Gebotsformular, das den Auktionsgegenstand benötigt:
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 amountDie View übergibt den Gegenstand jedes Mal, wenn sie das Formular erstellt: BidForm(request.POST, item=item). Wenn du item in der Signatur aufführst, bleibt es außerhalb von **kwargs; Djangos Formular kennt es nicht und würde einen TypeError auslösen.
Aufgabe
MittelLehne RSVPs für eine ausgebuchte Veranstaltung mit Sorry, this event is full. ab:
- Übergib
RSVPFormdie Veranstaltung als Schlüsselwortargumenteventund verwende sie in einer Prüfung des gesamten Formulars. - Eine Veranstaltung mit einem freien Platz nimmt noch einen Gast auf.
- Übergib die Veranstaltung überall dort, wo
event_detaildas Formular erstellt.
Klicke auf „Run“ und melde dich für den Töpferkurs an.
Probier es selbst
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"]
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Formulare
Übe selbstständig: Django-Playground