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! ומפנה לדף האירוע.

לחץ על Run, פתח אירוע ושלח 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})

כל השיעורים ביחידה טפסים

תרגלו בעצמכם: Django אונליין