מחיקת אירוע
חלק מהיחידה טפסים במסלול ה-Django של Coddy. שיעור 14 מתוך 20.
קישור הוא בקשת GET, ובקשת GET לעולם לא צריכה לשנות נתונים. דפדפנים טוענים קישורים מראש, אפליקציות צ׳אט פותחות אותם כדי להציג תצוגה מקדימה, ומנועי חיפוש עוקבים אחר כל קישור שהם מוצאים. קישור שמחק אירוע היה מוחק אותו בלי שאף אחד יחליט לעשות זאת.
לכן שינוי מתבצע בשני שלבים: בקשת GET מציגה דף ששואל אם להמשיך, ובקשת POST, שנשלחת בלחיצה על כפתור בטופס, מבצעת את הפעולה. אפליקציית חיוב שמסמנת חשבונית כמשולמת:
def pay_invoice(request, pk):
invoice = get_object_or_404(Invoice, pk=pk)
if request.method == "POST":
invoice.paid = True
invoice.save()
return redirect("bills:invoice", pk=invoice.pk)
return render(request, "bills/confirm_pay.html", {"invoice": invoice})טופס האישור לא צריך שדות, רק את האסימון וכפתור; טופס ללא action שולח בקשת POST לדף שבו הוא נמצא. המתודה .delete() מסירה שורה. לאחר המחיקה, יש להפנות לדף שעדיין קיים.
אתגר
קלהקישור Delete this event והעמוד שלו מוכנים:
- ב־
delete_event, בקשת GET רק מציגה את העמוד. בקשת POST מוחקת את האירוע ומפנה לרשימת האירועים. - ב־
delete_event.html, הוסף טופס ששולח נתונים לעמוד הזה, עם כפתורDelete.
לחץ על Run, פתח אירוע ומחק אותו.
נסו בעצמכם
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()
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()
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)
# מחק את האירוע רק כשהטופס נשלח, ואז חזור לרשימה.
return render(request, "events/delete_event.html", {"event": event})
כל השיעורים ביחידה טפסים
תרגלו בעצמכם: Django אונליין