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. 저자의 이름을 기준으로 일치시키려면 키 뒤에 밑줄 두 개를 붙이세요. filter(author__name="Ursula K. Le Guin").

여기서 비교할 객체는 방문자이므로 조회할 사람이 없습니다. Django는 이미 로그인한 사용자를 모든 요청에 넣어 둡니다. 누구나 바꿀 수 있는 URL이나 폼 필드에서 사용자를 가져오지 마세요.

challenge icon

챌린지

쉬움

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

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

사용자와 계정의 모든 레슨

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