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, והפתק נשאר ללא שינוי. עדיין אפשר לערוך ולמחוק את הפתקים שלכם.

לחצו על Run, התחברו בתור bob (סיסמה coddy-pass-123) ופתחו את /1/edit/.

נסו בעצמכם

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