Menu
CoddyTech

Acara Lengkap

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

Kelas Pottery memiliki 2 tempat dan 2 tamu, tetapi formulirnya masih menerima lebih banyak tamu. Aturannya harus ada di formulir, tetapi hanya view yang tahu untuk acara mana formulir itu digunakan.

Formulir adalah class Python, jadi kamu bisa memberinya __init__ sendiri. Terima nilai tambahan sebagai argumen kata kunci, simpan pada self, lalu teruskan sisanya ke super().__init__(). Formulir penawaran yang memerlukan barang 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 barang setiap kali membuat formulir: BidForm(request.POST, item=item). Menamai item dalam tanda tangan fungsi membuatnya tidak masuk ke **kwargs; formulir Django tidak mengenalinya dan akan memunculkan TypeError.

challenge icon

Tantangan

Sedang

Acara yang penuh menolak RSVP.

  1. Di events/forms.py, tambahkan __init__ ke RSVPForm yang menyimpan argumen kata kunci event pada self.event dan meneruskan sisanya ke super().__init__.
  2. Di clean(), saat tamu memenuhi capacity, munculkan Sorry, this event is full. Satu tempat yang tersisa masih dapat diisi oleh seorang tamu.
  3. Di event_detail, teruskan event ke kedua pemanggilan RSVPForm.

Daftar hadir untuk Pottery Class: kamu melihat Sorry, this event is full.

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