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 kötüsü, bu sayfaların hiç açılması bile gerekmiyor. Bir form, POST isteğidir ve herkes sayfayı hiç görmeden /3/delete/ adresine bir POST isteği gönderebilir.
Yani kural, bağlantı verdiğin sayfa başına değil, görünüm başınadı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 işlemi: her istekte ç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. Buradaki, tanımadık kişilerin erişimini reddeden bir arama, hem GET hem de POST isteğine 404 yanıtı verir ve hiçbir şey değiştirilmez.
Görev
Kolaynotes/views.py içinde, 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 burada GET ve POST istekleri için 404 yanıtı verilir ve not olduğu gibi kalır. Kendi notlarınızı düzenlemeye ve silmeye devam edebilirsiniz.
Çalıştır'a basın, bob olarak giriş yapın (parola coddy-pass-123) ve /1/edit/ adresini açın.
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