הפניה מחדש לאחר POST
חלק מהיחידה טפסים במסלול ה-Django של Coddy. שיעור 3 מתוך 20.
מוסיפים אירוע ואז טוענים מחדש את דף התודה: הדפדפן מציע לשלוח את הטופס שוב, והסכמה לכך מוסיפה את האירוע פעמיים. הדף הזה היה התגובה לבקשת POST, ולכן טעינה מחדש שלו שולחת שוב את בקשת POST.
הפתרון הוא תבנית שנקראת Post/Redirect/Get. לאחר השמירה, התצוגה מחזירה הפניה מחדש: קוד מצב 302 וכתובת חדשה. הדפדפן פותח את הכתובת הזאת באמצעות GET, ולכן טעינה מחדש חוזרת רק על בקשת GET.
redirect() מתוך django.shortcuts מקבלת שם של כתובת URL, כמו {% url %}. בחנות שמוסיפה פריט לעגלת הקניות:
from django.shortcuts import redirect
def add_to_cart(request, pk):
if request.method == "POST":
CartItem.objects.create(product_id=pk)
return redirect("shop:cart")
...כתובת URL עם ארגומנט מקבלת אותו לפי שמו: redirect("shop:product", pk=7).
אתגר
קלבתוך new_event, לאחר יצירת האירוע, הפנה לעמוד של האירוע החדש במקום להציג את event_added.html. אפשר למחוק את event_added.html; שום דבר כבר לא משתמש בו.
הוסף אירוע, ואז טען מחדש את העמוד שלו: הדפדפן לא מבקש לשלוח שוב את הטופס.
נסו בעצמכם
from django.shortcuts import get_object_or_404, render
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":
Event.objects.create(
title=request.POST["title"],
date=request.POST["date"],
place=request.POST["place"],
)
return render(request, "events/event_added.html")
return render(request, "events/new_event.html")
כל השיעורים ביחידה טפסים
תרגלו בעצמכם: Django אונליין