Menu
CoddyTech

Tam Kapsamlı Bir Etkinlik

Coddy'nin Django Journey'sinin Formlar bölümünün bir parçası. Ders 17 / 20.

Çömlekçilik Sınıfı'nın 2 yeri ve 2 konuğu var, ancak formu hâlâ daha fazlasını kabul ediyor. Kural forma aittir, ancak formun hangi etkinlik için olduğunu yalnızca görünüm bilir.

Form bir sınıftır, dolayısıyla daha fazla bağımsız değişken alabilir. Formunuzu __init__ içinde bir anahtar sözcük olarak alın, self üzerinde saklayın ve geri kalanını Django'nun __init__ metoduna iletin. Açık artırma öğesine ihtiyaç duyan bir teklif formu:

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

Görünüm, formu her oluşturduğunda öğeyi iletir: BidForm(request.POST, item=item). İmzada item adını belirtmek, onun **kwargs içinde yer almasını önler; Django'nun formu bu bağımsız değişkeni tanımaz ve TypeError hatası verir.

challenge icon

Görev

Orta

Tamamen dolu bir etkinliğe Sorry, this event is full. mesajıyla katılım isteklerini reddedin:

  • RSVPForm öğesine etkinliği event anahtar sözcük bağımsız değişkeni olarak verin ve tüm form üzerinde yapılan bir kontrolde kullanın.
  • Bir yeri kalan etkinlik yine de bir konuk daha kabul eder.
  • event_detail formu oluşturduğu her yerde etkinliği iletin.

Run düğmesine basın ve Pottery Class etkinliğine katılım isteği gönderin.

Kendin dene

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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Formlar bölümündeki tüm dersler

Kendi başına pratik yap: Django playground