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. תבנית התודה אינה בשימוש כעת: מחק אותה.

לחץ על Run, הוסף אירוע וטען מחדש את הדף שאליו הגעת.

נסו בעצמכם

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