Menu
CoddyTech

Acara Lengkap

Termasuk bagian Formulir dalam perjalanan Django di Coddy. Pelajaran 17 dari 20.

Pottery Class memiliki 2 tempat dan 2 tamu, tetapi form-nya masih menerima lebih banyak. Aturannya harus ada di form, tetapi hanya view yang tahu untuk event mana form tersebut digunakan.

Form adalah class, jadi form bisa menerima argumen tambahan. Teruskan argumenmu sebagai kata kunci di __init__, simpan di self, lalu teruskan sisanya ke __init__ milik Django. Form bid yang membutuhkan item lelang:

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

View meneruskan item setiap kali membuat form: BidForm(request.POST, item=item). Menyertakan item dalam signature membuatnya tidak masuk ke **kwargs; form Django tidak mengenalinya dan akan memunculkan TypeError.

challenge icon

Tantangan

Sedang

Tolak RSVP untuk acara yang sudah penuh dengan Sorry, this event is full.:

  • Berikan acara kepada RSVPForm sebagai argumen kata kunci event, lalu gunakan acara itu untuk memeriksa seluruh formulir.
  • Acara yang masih memiliki satu tempat kosong tetap menerima satu tamu lagi.
  • Teruskan acara setiap kali event_detail membuat formulir.

Tekan Jalankan, lalu RSVP untuk Pottery Class.

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Formulir

Latihan sendiri: Playground Django