Menu
CoddyTech

メールアドレスごとに1件のRSVP

CoddyのDjangoジャーニー「フォーム」セクションの一部。レッスン 18/20。

この章はあなたのものです。知識を活かして、イベントボードに3つの機能を追加しましょう。各タスクにはサイトが実行すべきことが書かれています。コードはあなた次第です。

今のところ、Adaは金曜のジャズナイトに好きなだけRSVPでき、RSVPするたびに1つ席が埋まります。1つのメールアドレスにつき、イベントごとに1つの席だけを確保できるようにしましょう。

必要なものはすべてそろっています。clean_<field>メソッド、フォームが保持しているイベントのself.event、そしてそのRSVPのself.event.rsvpsです。もう1つ、検索に役立つものがあります。email__iexactは大文字と小文字を区別せずにテキストを比較します。これは、Ada@Example.comとada@example.comが同じ受信トレイに届くためです。

challenge icon

チャレンジ

中級

同じメールアドレスから同じイベントへの2回目のRSVPを拒否し、メール欄の横にThis email is already on the guest list.と表示します。

  • 大文字と小文字は区別されません。ADA@Example.comはada@example.comと同じです。
  • 同じメールアドレスで別のイベントにRSVPすることはできます。

ADA@example.comとしてFriday Jazz NightにRSVPすると、「This email is already on the guest list.」と表示されます。

自分で試してみよう

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"]

    def __init__(self, *args, event=None, **kwargs):
        super().__init__(*args, **kwargs)
        self.event = event

    def clean(self):
        cleaned_data = super().clean()
        if self.event.rsvps.count() >= self.event.capacity:
            raise forms.ValidationError("Sorry, this event is full.")
        return cleaned_data

フォームのすべてのレッスン

自分で練習してみよう: Djangoプレイグラウンド