다른 사람의 메모
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 서버 오류, 즉 충돌이 표시됩니다.
챌린지
쉬움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 플레이그라운드