نموذج لتأكيد الحضور
جزء من قسم النماذج في رحلة Django على Coddy. الدرس 16 من 20.
يريد الزوار إخبارك بأنهم قادمون. يحتوي المشروع على نموذج جديد RSVP مع ForeignKey إلى Event (related_name="rsvps")، وتحتوي صفحة كل فعالية على نموذج أسفل العنوان هل ستأتي؟
يطلب نموذج RSVP الاسم والبريد الإلكتروني، ولا يطلب الفعالية مطلقًا: فالزائر موجود في صفحة تلك الفعالية، وإضافة حقل ستتيح له اختيار فعالية أخرى. اترك الفعالية خارج fields، وحددها في العرض بدلًا من ذلك.
ينشئ form.save(commit=False) الكائن من دون حفظه، لذا يمكنك تحديد بقية القيم أولًا. نموذج الطلب في المتجر لا يطلب الحالة مطلقًا:
form = OrderForm(request.POST)
if form.is_valid():
order = form.save(commit=False)
order.status = "new"
order.save()أما form.save() العادي فيحفظ الصف فورًا، وترك ForeignKey مطلوبًا فارغًا يؤدي إلى تعطل البرنامج مع IntegrityError.
التحدي
متوسطأتح للزوار تأكيد الحضور.
- في
events/forms.py، اكتب نموذجًا من نوع ModelForm باسمRSVPFormلـRSVPيحتوي فقط علىnameوemail. - في
event_detail، مرّرRSVPFormإلى الصفحة باسمform. عند إرسال POST، أنشئه منrequest.POST. - إذا كان صالحًا، فاحفظه باستخدام
commit=False، وعيّن الحدث الخاص به، ثم احفظه، وأضفYou're on the list!وأعِد التوجيه إلى الحدث. وإذا لم يكن صالحًا، فأظهر النموذج مرة أخرى.
أكّد حضورك لليلة الجاز يوم الجمعة: ستظهر لك You're on the list!
جرّب بنفسك
from django.contrib import messages
from django.shortcuts import get_object_or_404, redirect, render
from .forms import EventForm
from .models import Event
def event_list(request):
q = request.GET.get("q", "")
events = Event.objects.all()
if q:
events = events.filter(title__icontains=q)
return render(request, "events/event_list.html", {"events": events, "q": q})
def event_detail(request, pk):
event = get_object_or_404(Event, pk=pk)
return render(request, "events/event_detail.html", {"event": event})
def new_event(request):
if request.method == "POST":
form = EventForm(request.POST)
if form.is_valid():
event = form.save()
messages.success(request, "Your event was added.")
return redirect("events:detail", pk=event.pk)
else:
form = EventForm()
return render(request, "events/new_event.html", {"form": form})
def edit_event(request, pk):
event = get_object_or_404(Event, pk=pk)
if request.method == "POST":
form = EventForm(request.POST, instance=event)
if form.is_valid():
form.save()
messages.success(request, "Your changes were saved.")
return redirect("events:detail", pk=event.pk)
else:
form = EventForm(instance=event)
return render(request, "events/edit_event.html", {"form": form, "event": event})
def delete_event(request, pk):
event = get_object_or_404(Event, pk=pk)
if request.method == "POST":
event.delete()
messages.success(request, "The event was deleted.")
return redirect("events:list")
return render(request, "events/delete_event.html", {"event": event})
جميع دروس النماذج
تدرّب بنفسك: Playground لـ Django