Menu
CoddyTech

A página de autores

Parte da seção Models e o Admin do Journey de Django da Coddy. Lição 22 de 23.

Sua estante tem uma página para cada livro, mas nenhuma para os autores. Este projeto cria uma página com base no que você sabe: uma view que consulta o banco de dados, uma URL, um template que acompanha as relações e um QuerySet que não executa uma consulta por linha.

Cada autor é listado com seus livros: um loop pelos autores e, dentro dele, um loop pelos livros de cada autor. Sem ajuda, o loop interno executa uma consulta por autor. select_related() não pode ajudar, porque a relação entre um autor e seus livros é reversa. Seu parceiro, prefetch_related(), busca as linhas relacionadas de cada objeto da lista com apenas uma consulta adicional. Book.objects.prefetch_related("loans") busca os empréstimos de todos os livros em uma consulta adicional. Ele recebe o nome da relação.

A tarefa especifica o que a página deve fazer; o código é com você.

challenge icon

Desafio

Médio

Crie uma página de autores.

  1. Em books/views.py, escreva author_list: renderize books/author_list.html com todos os autores, usando prefetch_related().
  2. Em books/urls.py, adicione authors/ com o nome authors.
  3. Em author_list.html, coloque cada autor em uma <section class="author">: o nome em um <h2> e um <li> para cada livro, com o título vinculado à página do livro.
  4. Em books/base.html, adicione um link para Authors no <header>.

Clique em Authors: Herbert lista Children of Dune e Dune.

Experimente você mesmo

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})

Todas as lições de Models e o Admin

Pratique por conta própria: Playground de Django