Menu
CoddyTech

Nur der Besitzer bearbeitet

Teil des Abschnitts Benutzer und Konten der Django-Journey von Coddy. Lektion 11 von 16.

Die Seite einer Notiz ist jetzt geschützt, aber ihre Bearbeitungs- und Löschseiten sind es nicht: /3/edit/ und /3/delete/ öffnen weiterhin jede beliebige Notiz. Schlimmer noch: Sie müssen gar nicht erst geöffnet werden. Ein Formular ist eine POST-Anfrage, und jeder kann eine POST-Anfrage an /3/delete/ senden, ohne die Seite jemals gesehen zu haben.

Die Regel gilt also für jede View und nicht für jede Seite, auf die du verlinkst: Jede View, die eine Zeile anhand ihrer Nummer lädt, entscheidet dort, wer sie laden darf. Sieh dir an, wo die Abfrage in einer View steht, die sowohl GET als auch POST verarbeitet:

def ticket_close(request, pk):
    ticket = ...  # die Abfrage: Sie wird bei jeder Anfrage ausgeführt
    if request.method == "POST":
        ticket.closed = True
        ticket.save()
        return redirect("tickets:list")
    return render(request, "tickets/close.html", {"ticket": ticket})

Die erste Zeile wird vor dem if request.method == "POST"-Zweig ausgeführt. Eine Abfrage an dieser Stelle, die Unbefugte abweist, antwortet ihnen sowohl auf die GET- als auch auf die POST-Anfrage mit 404, und es wird nichts geändert.

challenge icon

Aufgabe

Einfach

Sorge in notes/views.py dafür, dass note_edit und note_delete Notizen ablehnen, die nicht dem Benutzer gehören. Bei GET- und POST-Anfragen führt die Notiz eines anderen Benutzers dort zu einem 404-Fehler und bleibt unverändert. Eigene Notizen lassen sich weiterhin bearbeiten und löschen.

Klicke auf „Run“, melde dich als bob (Passwort coddy-pass-123) an und öffne /1/edit/.

Probier es selbst

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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Benutzer und Konten

Übe selbstständig: Django-Playground