メールアドレスごとに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が同じ受信トレイに届くためです。
チャレンジ
中級同じメールアドレスから同じイベントへの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プレイグラウンド