Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Di 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})
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pengguna dan Akun

Latihan sendiri: Playground Django