내 메모만 보기
Coddy Django 여정의 사용자와 계정 섹션에 포함된 레슨. 16개 중 9번째.
모든 노트에는 소유자가 있지만, 목록에는 여전히 Note.objects.all()이 표시됩니다. ada가 bob의 일기를 읽을 수 있습니다. 목록에는 요청한 사람의 노트만 표시되어야 합니다.
이름이 아니라 객체를 사용해 ForeignKey를 기준으로 필터링합니다. 도서관 사이트에서 저자 한 명의 책을 나열하는 경우를 살펴보겠습니다.
author = Author.objects.get(name="Ursula K. Le Guin")
books = Book.objects.filter(author=author)Django는 저자의 id를 비교합니다. 이름을 전달하면 filter(author="Ursula K. Le Guin")처럼 오류가 발생합니다. ValueError. 저자의 이름을 기준으로 일치시키려면 키 뒤에 밑줄 두 개를 붙이세요. filter(author__name="Ursula K. Le Guin").
여기서 비교할 객체는 방문자이므로 조회할 사람이 없습니다. Django는 이미 로그인한 사용자를 모든 요청에 넣어 둡니다. 누구나 바꿀 수 있는 URL이나 폼 필드에서 사용자를 가져오지 마세요.
챌린지
쉬움note_list에서 로그인한 사용자의 메모만 목록에 표시하세요.
ada로 로그인하세요(비밀번호는 coddy-pass-123): 목록에는 Shopping list와 Ideas가 표시되고, Bob's diary는 표시되지 않습니다.
직접 해보기
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.all()
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 플레이그라운드