Menu
CoddyTech

רק הבעלים עורך

חלק מהיחידה משתמשים וחשבונות במסלול ה-Django של Coddy. שיעור 11 מתוך 16.

העמוד של פתק בטוח כעת, אבל עמודי העריכה והמחיקה שלו אינם בטוחים: /3/edit/ ו־/3/delete/ עדיין פותחים כל פתק. חמור מכך, אין צורך לפתוח אותם כלל. טופס שולח בקשת POST, וכל אחד יכול לשלוח בקשת POST אל /3/delete/ בלי לראות את העמוד מעולם.

לכן הכלל חל על כל תצוגה, ולא רק על עמוד שאליו מקשרים: כל תצוגה שטוענת רשומה לפי המספר שלה קובעת שם מי רשאי לטעון אותה. בדקו היכן נמצא החיפוש בתצוגה שמטפלת גם ב־GET וגם ב־POST:

def ticket_close(request, pk):
    ticket = ...  # החיפוש: הוא מתבצע עבור כל בקשה
    if request.method == "POST":
        ticket.closed = True
        ticket.save()
        return redirect("tickets:list")
    return render(request, "tickets/close.html", {"ticket": ticket})

השורה הראשונה רצה לפני הענף if request.method == "POST". אם החיפוש הזה גם בודק מי הבעלים, אדם זר יקבל 404 עבור בקשת GET ועבור בקשת POST, ושום דבר לא ישתנה.

challenge icon

אתגר

קל

ב־notes/views.py, צריך לגרום ל־note_edit ול־note_delete לסרב לטפל בפתקים שאינם שייכים למשתמש. בקשה להצגת פתק של משתמש אחר מחזירה שם 404, גם ב־GET וגם ב־POST, והפתק נשאר כפי שהיה. הפתקים שלך עדיין ניתנים לעריכה ולמחיקה.

התחבר בתור bob (סיסמה coddy-pass-123) ופתח את /1/edit/: דף 404 לא נמצא.

נסו בעצמכם

from django.contrib.auth import login
from django.contrib.auth.decorators import login_not_required
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import get_object_or_404, redirect, render

from .forms import NoteForm
from .models import Note


def note_list(request):
    notes = Note.objects.filter(owner=request.user)
    return render(request, "notes/note_list.html", {"notes": notes})


def note_detail(request, pk):
    note = get_object_or_404(Note, pk=pk, owner=request.user)
    return render(request, "notes/note_detail.html", {"note": note})


def note_create(request):
    if request.method == "POST":
        form = NoteForm(request.POST)
        if form.is_valid():
            note = form.save(commit=False)
            note.owner = request.user
            note.save()
            return redirect("notes:detail", pk=note.pk)
    else:
        form = NoteForm()
    return render(request, "notes/note_form.html", {"form": form})


def note_edit(request, pk):
    note = get_object_or_404(Note, pk=pk)
    if request.method == "POST":
        form = NoteForm(request.POST, instance=note)
        if form.is_valid():
            form.save()
            return redirect("notes:detail", pk=note.pk)
    else:
        form = NoteForm(instance=note)
    return render(request, "notes/note_form.html", {"form": form, "note": note})


def note_delete(request, pk):
    note = get_object_or_404(Note, pk=pk)
    if request.method == "POST":
        note.delete()
        return redirect("notes:list")
    return render(request, "notes/note_confirm_delete.html", {"note": note})


@login_not_required
def signup(request):
    if request.method == "POST":
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect("notes:list")
    else:
        form = UserCreationForm()
    return render(request, "notes/signup.html", {"form": form})
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה משתמשים וחשבונות

תרגלו בעצמכם: Django אונליין