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.
Aufgabe
EinfachSorge 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})
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