Búsqueda de libros
Parte de la sección Modelos y el panel de administración del Journey de Django de Coddy. Lección 15 de 23.
Tu estantería necesita un cuadro de búsqueda. Una página de búsqueda lee lo que escribió el visitante desde la dirección. En /search/?q=dune, la parte que va después de ? es la cadena de consulta, y Django coloca sus pares en request.GET, que funciona como un diccionario. El cuadro de búsqueda de la cabecera es un formulario que construye esta dirección por ti; la sección Formularios trata los formularios. Una página para un género podría leerla así:
def by_genre(request):
genre = request.GET.get("genre", "fiction")
books = Book.objects.filter(genre=genre)
return render(request, "books/genre.html", {"genre": genre, "books": books}).get("genre", "fiction") devuelve el valor predeterminado cuando la dirección no contiene genre; request.GET["genre"] provocaría un error en ese caso: un error 500. Los valores siempre son texto: ?page=2 da "2". Todo texto contiene el texto vacío, así que __icontains="" coincide con todas las filas.
Desafío
FácilAñade una página de búsqueda. La plantilla books/search.html está lista y espera q y books.
- Una vista
searchque leeqde la dirección (texto vacío si falta) y encuentra los libros cuyo título lo contiene, sin distinguir entre mayúsculas y minúsculas. - La ruta
search/, llamadasearch.
Pulsa Run, busca dune en el encabezado y después abre /search/.
Pruébalo tú mismo
from django.shortcuts import get_object_or_404, render
from .models import Book
def home(request):
books = Book.objects.all()
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})
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