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 Notiz. Schlimmer noch: Sie müssen gar nicht erst geöffnet werden. Ein Formular sendet eine POST-Anfrage, und jeder kann eine POST-Anfrage an /3/delete/ senden, ohne die Seite jemals gesehen zu haben.
Die Regel gilt also pro View, nicht pro Seite, auf die du verlinkst: Jede View, die eine Zeile anhand ihrer Nummer lädt, entscheidet dort, wer sie laden darf. Sieh dir an, an welcher Stelle die Suche in einer View steht, die sowohl GET als auch POST verarbeitet:
def ticket_close(request, pk):
ticket = ... # die Suche: 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 Zweig if request.method == "POST" ausgeführt. Wenn diese Suche auch den Eigentümer prüft, erhält eine fremde Person sowohl für GET als auch für POST einen 404-Fehler, und nichts ändert sich.
Aufgabe
EinfachSorge in notes/views.py dafür, dass note_edit und note_delete Notizen ablehnen, die nicht dem angemeldeten Benutzer gehören. Die Notiz eines anderen Benutzers führt dort bei GET und POST zu einer 404-Antwort und bleibt unverändert. Deine eigenen Notizen kannst du weiterhin bearbeiten und löschen.
Melde dich als bob an (Passwort coddy-pass-123) und rufe /1/edit/ auf: 404-Seite nicht gefunden.
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})
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
3Deine eigenen Daten
Eine Notiz hat einen BesitzerNur meine NotizenÜbe selbstständig: Django-Playground