Hanya Pemilik yang Mengedit
Termasuk bagian Pengguna dan Akun dalam perjalanan Django di Coddy. Pelajaran 11 dari 16.
Halaman catatan kini aman, tetapi halaman edit dan hapusnya belum aman: /3/edit/ dan /3/delete/ masih bisa membuka catatan apa pun. Lebih buruk lagi, halaman itu bahkan tidak perlu dibuka. Formulir mengirim permintaan POST, dan siapa pun bisa mengirim POST ke /3/delete/ tanpa pernah melihat halamannya.
Jadi, aturan ini berlaku untuk setiap view, bukan hanya halaman yang kamu tautkan: setiap view yang memuat baris berdasarkan nomornya menentukan di sana siapa yang boleh memuatnya. Perhatikan letak pencarian dalam view yang menangani GET dan POST:
def ticket_close(request, pk):
ticket = ... # pencarian ini: dijalankan untuk setiap request
if request.method == "POST":
ticket.closed = True
ticket.save()
return redirect("tickets:list")
return render(request, "tickets/close.html", {"ticket": ticket})Baris pertama berjalan sebelum cabang if request.method == "POST". Pencarian di sana yang menolak orang asing akan memberikan respons 404 untuk GET maupun POST, dan tidak ada yang berubah.
Tantangan
MudahDi notes/views.py, buat note_edit dan note_delete menolak catatan yang bukan milik pengguna. Catatan milik pengguna lain akan menghasilkan 404 di sana, untuk GET dan POST, serta tetap seperti semula. Catatan milikmu tetap bisa diedit dan dihapus.
Tekan Jalankan, masuk sebagai bob (kata sandi coddy-pass-123), lalu buka /1/edit/.
Coba sendiri
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})
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pengguna dan Akun
3Datamu Sendiri
Sebuah Catatan Memiliki PemilikHanya CatatankuLatihan sendiri: Playground Django