Menu
CoddyTech

다른 사람의 메모

Coddy Django 여정의 사용자와 계정 섹션에 포함된 레슨. 16개 중 10번째.

목록에서는 다른 사람의 노트가 숨겨지지만, 노트 페이지에서는 숨겨지지 않습니다. 노트 번호는 /1/, /2/, /3/처럼 매겨져 있으므로 누구나 다음 번호를 시도해 노트를 읽을 수 있습니다. 링크를 숨기는 것만으로는 충분하지 않습니다. 각 페이지에서 확인해야 합니다.

get_object_or_404()는 filter()와 같은 조회 조건을 원하는 만큼 받아, 모든 조건이 일치하는 경우에만 행을 찾습니다. 상점 페이지에는 아직 열려 있는 주문만 표시됩니다.

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

닫힌 주문은 존재하지 않는 주문 번호와 마찬가지로 여기에서 404 페이지를 찾을 수 없음으로 응답합니다. 비공개 행에 대해서는 의도된 동작입니다. 403 금지 응답을 보내면 낯선 사람에게 그 행이 존재한다는 사실을 알려주기 때문입니다.

Order.objects.get()을 사용하면 대신 DoesNotExist가 발생하고, 방문자에게는 500 서버 오류, 즉 충돌이 표시됩니다.

challenge icon

챌린지

쉬움

note_detail에서 메모는 소유자에게만 표시하세요. 메모가 다른 사람의 것이거나 해당 번호가 존재하지 않으면 페이지는 404 응답을 보냅니다.

bob(비밀번호 coddy-pass-123)으로 로그인한 뒤, ada의 메모 중 하나인 /1/을 여세요. 404 페이지를 찾을 수 없음.

직접 해보기

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

사용자와 계정의 모든 레슨

직접 연습해 보세요: Django 플레이그라운드