다른 사람의 메모
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로 응답합니다.
Run을 누르고 bob(비밀번호 coddy-pass-123)으로 로그인한 다음, ada의 메모 중 하나인 /1/을 여세요.
직접 해보기
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 플레이그라운드