Menu
CoddyTech

Catatan Milik Orang Lain

Termasuk bagian Pengguna dan Akun dalam perjalanan Django di Coddy. Pelajaran 10 dari 16.

Daftar menyembunyikan catatan orang lain, tetapi halaman catatan tidak. Catatan diberi nomor /1/, /2/, /3/, jadi siapa pun bisa mencoba nomor berikutnya dan membacanya. Menyembunyikan tautan di daftar saja tidak cukup: setiap halaman harus memeriksa.

get_object_or_404() menerima pencarian yang sama seperti filter(), sebanyak yang kamu inginkan, dan menemukan baris hanya jika semuanya cocok. Halaman toko hanya menampilkan pesanan yang masih terbuka:

order = get_object_or_404(Order, pk=pk, status="open")

Pesanan yang sudah ditutup akan menampilkan 404 Page not found di sana, sama seperti nomor yang tidak ada. Untuk baris privat, hal ini memang disengaja: 403 Forbidden akan memberi tahu orang asing bahwa baris tersebut ada.

Order.objects.get() justru akan memunculkan DoesNotExist, dan pengunjung akan mendapat 500 Server Error, yaitu crash.

challenge icon

Tantangan

Mudah

Di note_detail, tampilkan catatan hanya kepada pemiliknya. Catatan milik orang lain dan nomor yang tidak ada sama-sama memberikan respons 404.

Tekan Jalankan, masuk sebagai bob (kata sandi coddy-pass-123), lalu buka /1/, salah satu catatan milik ada.

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)
    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})

Semua pelajaran di Pengguna dan Akun

Latihan sendiri: Playground Django