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

التحدي

متوسط
  • في events/forms.py، أضف RSVPForm، وهو نموذج ModelForm لـ RSVP يطلب name وemail فقط.
  • في event_detail، مرّره إلى القالب باسم form. يحفظ طلب POST صالح RSVP لهذا الحدث، ويضيف الرسالة You're on the list!، ثم يعيد التوجيه إلى صفحة الحدث.

اضغط على تشغيل، وافتح حدثًا وأرسل RSVP.

جرّب بنفسك

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