Yalnızca Sahibi Düzenleyebilir
Coddy'nin Django Journey'sinin Kullanıcılar ve Hesaplar bölümünün bir parçası. Ders 11 / 16.
Bir notun sayfası artık güvenli, ancak düzenleme ve silme sayfaları değil: /3/edit/ ve /3/delete/ hâlâ herhangi bir notu açıyor. Daha da kötüsü, bu sayfaların açılmasına bile gerek yok. Bir form, POST isteğidir ve herkes sayfayı hiç görmeden /3/delete/ adresine POST isteği gönderebilir.
Dolayısıyla kural, bağlantı verdiğin sayfaya değil, her görünüme uygulanır: bir satırı numarasına göre yükleyen her görünüm, o satırı kimin yükleyebileceğine orada karar verir. Hem GET hem de POST isteklerini işleyen bir görünümde aramanın nerede yapıldığına bak:
def ticket_close(request, pk):
ticket = ... # arama: her istek için çalışır
if request.method == "POST":
ticket.closed = True
ticket.save()
return redirect("tickets:list")
return render(request, "tickets/close.html", {"ticket": ticket})İlk satır, if request.method == "POST" dalından önce çalışır. Bu arama sahibini de kontrol ediyorsa, başka biri hem GET hem de POST isteğinde 404 alır ve hiçbir şey değişmez.
Görev
Kolaynotes/views.py dosyasında note_edit ve note_delete işlevlerinin kullanıcıya ait olmayan notları reddetmesini sağlayın. Başka bir kullanıcının notuna GET ve POST isteklerinde 404 yanıtı verilir ve not olduğu gibi kalır. Kendi notlarınızı düzenlemeye ve silmeye devam edebilirsiniz.
bob olarak giriş yapın (parola coddy-pass-123) ve /1/edit/ adresini açın: 404 Sayfa bulunamadı.
Kendin dene
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})
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Kullanıcılar ve Hesaplar bölümündeki tüm dersler
3Kendi Verileriniz
Bir Notun Sahibi VardırYalnızca NotlarımKendi başına pratik yap: Django playground