Menu
CoddyTech

نموذج لتأكيد الحضور

جزء من قسم النماذج في رحلة 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.

challenge icon

التحدي

متوسط

أتح للزوار تأكيد الحضور.

  1. في events/forms.py، اكتب نموذجًا من نوع ModelForm باسم RSVPForm لـ RSVP يحتوي فقط على name وemail.
  2. في event_detail، مرّر RSVPForm إلى الصفحة باسم form. عند إرسال POST، أنشئه من request.POST.
  3. إذا كان صالحًا، فاحفظه باستخدام 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