La pagina degli autori
Fa parte della sezione Modelli e pannello di amministrazione del percorso Django di Coddy. Lezione 22 di 23.
La tua libreria ha una pagina per ogni libro, ma nessuna per gli autori. Questo progetto ne crea una a partire da ciò che sai: una vista che interroga il database, un URL, un template che segue le relazioni e un QuerySet che non esegue una query per ogni riga.
Ogni autore è elencato insieme ai suoi libri: un ciclo sugli autori e, al suo interno, un ciclo sui libri di ciascun autore. Senza aiuto, il ciclo interno esegue una query per ogni autore. select_related() non può essere d'aiuto, perché il passaggio da un autore ai suoi libri è una relazione inversa. Il suo corrispettivo, prefetch_related(), recupera le righe correlate di ogni oggetto nell'elenco con una query aggiuntiva. Book.objects.prefetch_related("loans") recupera i prestiti di ogni libro con una query aggiuntiva. Richiede il nome della relazione.
Il compito descrive cosa deve fare la pagina; il codice spetta a te.
Sfida
MedioCrea una pagina degli autori.
- In
books/views.py, scriviauthor_list: esegui il rendering dibooks/author_list.htmlcon tutti gli autori, usandoprefetch_related(). - In
books/urls.py, aggiungiauthors/con il nomeauthors. - In
author_list.html, assegna a ogni autore una<section class="author">: il nome in un<h2>, un<li>per ogni libro, con il titolo collegato alla relativa pagina. - In
books/base.html, aggiungi un collegamento adAuthorsnell'<header>.
Fai clic su Authors: Herbert mostra Children of Dune e Dune.
Provalo tu
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})
Tutte le lezioni di Modelli e pannello di amministrazione
Esercitati da solo: Playground Django