Menu
CoddyTech

작가 페이지

Coddy Django 여정의 모델과 관리자 섹션에 포함된 레슨. 23개 중 22번째.

책장에는 책마다 페이지가 있지만 작가를 위한 페이지는 없습니다. 이 프로젝트에서는 알고 있는 내용을 바탕으로 페이지를 만듭니다. 데이터베이스를 조회하는 뷰, URL, 관계를 따라가는 템플릿, 그리고 행마다 쿼리를 실행하지 않는 QuerySet을 사용합니다.

각 작가와 그 작가의 책을 나열합니다. 작가를 순회하는 반복문을 만들고, 그 안에서 각 작가의 책을 순회하는 반복문을 만듭니다. 별도의 도움 없이는 내부 반복문이 작가마다 쿼리 하나를 실행합니다. 작가에서 책으로 이어지는 관계는 역방향 관계이므로 select_related()로는 해결할 수 없습니다. 이에 대응하는 prefetch_related()는 쿼리를 하나 더 실행해 목록에 있는 각 객체와 관련된 행을 가져옵니다. Book.objects.prefetch_related("loans")는 쿼리 하나를 추가로 실행해 모든 책의 대출 정보를 가져옵니다. 여기에 관계 이름을 전달합니다.

과제는 페이지가 해야 할 일을 알려 줍니다. 코드는 여러분이 작성합니다.

challenge icon

챌린지

중급

저자 페이지를 만드세요.

  1. books/views.py에서 모든 저자를 포함해 books/author_list.html을 렌더링하도록 author_list를 작성하고, prefetch_related()를 사용하세요.
  2. books/urls.py에 이름이 authors인 authors/를 추가하세요.
  3. author_list.html에서 각 저자마다 <section class="author">를 지정하세요. 이름은 <h2> 안에 넣고, 각 책마다 제목을 해당 책 페이지에 연결하는 <li>를 하나씩 만드세요.
  4. books/base.html의 <header>에 Authors 링크를 추가하세요.

Authors를 클릭하면 Herbert 아래에 Children of Dune과 Dune이 표시됩니다.

직접 해보기

from django.shortcuts import get_object_or_404, render

from .models import Book


def home(request):
    books = Book.objects.select_related("author")
    return render(request, "books/home.html", {"books": books})


def book_detail(request, pk):
    book = get_object_or_404(Book, pk=pk)
    return render(request, "books/book_detail.html", {"book": book})


def search(request):
    q = request.GET.get("q", "")
    books = Book.objects.filter(title__icontains=q).select_related("author")
    return render(request, "books/search.html", {"q": q, "books": books})

모델과 관리자의 모든 레슨

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