Menu
CoddyTech

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.

challenge icon

Sfida

Medio

Crea una pagina degli autori.

  1. In books/views.py, scrivi author_list: esegui il rendering di books/author_list.html con tutti gli autori, usando prefetch_related().
  2. In books/urls.py, aggiungi authors/ con il nome authors.
  3. 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.
  4. In books/base.html, aggiungi un collegamento ad Authors nell'<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