Menu
CoddyTech

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 amount

Die 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.

challenge icon

Aufgabe

Mittel

Lehne RSVPs für eine ausgebuchte Veranstaltung mit Sorry, this event is full. ab:

  • Übergib RSVPForm die Veranstaltung als Schlüsselwortargument event und 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_detail das 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"]
quiz iconTeste dich selbst

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