Menu
CoddyTech

내 메모만 보기

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가 발생합니다.

비교할 행이 방문자에 해당하는 경우에는 조회할 사람이 없습니다. Django는 세션에서 로그인한 사용자를 객체로 가져와 이미 모든 요청에 넣어 두기 때문입니다. URL이나 양식 필드에서 사용자를 가져오지 마세요. 누구나 이를 변경할 수 있습니다.

challenge icon

챌린지

쉬움

note_list에서 로그인한 사용자의 메모만 나열하세요.

실행을 누르고 ada로 로그인한 다음 로그아웃하고 bob으로 로그인하세요(둘 다 coddy-pass-123을 사용합니다). 각 사용자는 자신의 메모만 볼 수 있습니다.

직접 해보기

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})
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

사용자와 계정의 모든 레슨

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