טופס אישור הגעה
חלק מהיחידה טפסים במסלול ה-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, הוסף את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 אונליין