Una página de autor
Parte de la sección Modelos y el panel de administración del Journey de Django de Coddy. Lección 23 de 23.
La última pieza: cada autor tiene su propia página, enlazada desde todos los lugares donde aparece el nombre de un autor. Es la página del libro que creaste en esta sección, para otro modelo.
Piensa en las tres formas de llegar. Una persona que visita /authors/ hace clic en un nombre. Una persona que visita la página de un libro hace clic en «by Frank Herbert». Y alguien escribe la dirección de un autor que no existe, y debería recibir un 404, no provocar un error.
Crea cada enlace con {% url %} y el id del autor, para que los enlaces sigan urls.py si alguna vez cambia.
Desafío
IntermedioDale a cada autor una página en /authors/<id>/ llamada author_detail:
- El nombre del autor en un
<h1>y enlaces a sus libros. - Un id sin autor devuelve 404.
- En
/authors/, el nombre de cada autor en su<h2>enlaza a la página. - En la página de un libro, el nombre del autor enlaza a ella.
Presiona Run y haz clic en un nombre en /authors/.
Pruébalo tú mismo
from django.shortcuts import get_object_or_404, render
from .models import Author, 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})
def author_list(request):
authors = Author.objects.prefetch_related("books")
return render(request, "books/author_list.html", {"authors": authors})
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Modelos y el panel de administración
3Páginas desde la base de datos
Una lista desde la base de datosUna página para cada libroPractica por tu cuenta: Playground de Django