Menu
CoddyTech

Страница авторов

Часть раздела Модели и панель администратора путешествия по Django на Coddy. Урок 22 из 23.

На вашей книжной полке есть страница для каждой книги, но нет страницы для авторов. В этом проекте вы создадите её на основе того, что уже знаете: представление, которое выполняет запрос к базе данных, URL, шаблон, который использует связи, и QuerySet, который не выполняет отдельный запрос для каждой строки.

Для каждого автора перечислены его книги: цикл по авторам, а внутри него — цикл по книгам каждого автора. Без дополнительной помощи внутренний цикл выполняет отдельный запрос для каждого автора. select_related() здесь не поможет, потому что связь от автора к его книгам является обратной. Его аналог, prefetch_related(), получает связанные строки для каждого объекта в списке ещё одним запросом. Book.objects.prefetch_related("loans") получает займы всех книг одним дополнительным запросом. Этот метод принимает имя связи.

В задании указано, что должна делать страница; код пишете вы.

challenge icon

Задание

Средне

Создай страницу авторов.

  1. В books/views.py напиши author_list: отобрази books/author_list.html со всеми авторами, используя prefetch_related().
  2. В books/urls.py добавь маршрут authors/ с именем authors.
  3. В author_list.html создай для каждого автора <section class="author">: имя помести в <h2>, а для каждой книги добавь отдельный <li>, связав её название со страницей книги.
  4. В books/base.html добавь ссылку «Авторы» в <header>.

Нажми «Авторы»: у Герберта будут перечислены «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