Menu
CoddyTech

הפניה מחדש לאחר 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).

challenge icon

אתגר

קל

בתוך 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 אונליין