Vistas genéricas: listados y detalle

Vistas genéricas son una forma de crear vistas que se pueden reutilizar en diferentes proyectos.

URL mapping

urlpatterns = [
    path('', views.index, name='index'),
    path('books/', views.BookListView.as_view(), name='books'),
]

Redirección incial

urls.py del proyecto

from django.views.generic import RedirectView
from django.urls import include, path
from django.contrib import admin
from django.conf.urls.static import static


urlpatterns = [
    path('admin/', admin.site.urls),
    path('catalog/', include('catalog.urls')),
    path('/', RedirectView.as_view(url='/catalog/', permanent=True)),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

# Este static es solo para DEBUG = True

generic.ListView

from django.views import generic

class BookListView(generic.ListView):
    model = Book
  • La vista genérica consultará a la base de datos para obtener todos los registros del modelo especificado (Book)
  • renderizará una plantilla ubicada en /biblioteca/catalogo/templates/catalogo/book_list.html
  • Dentro de la plantilla puedes acceder a la lista de libros mediante la variable de plantilla llamada object_list O book_list
  • Paginación: Añade un page_obj al contexto https://docs.djangoproject.com/en/4.1/topics/pagination/

Estos datos se pueden sobreescribir:

  • context_object_name
  • queryset
  • template_name

Métodos que podemos sobreescribir:

  • get_queryset
  • get_context_data

Ejemplo context_data


from django.utils import timezone
from django.views.generic.detail import DetailView

from catalog.models import Book

class BookDetailView(DetailView):

    model = Book

    def get_context_data(self, **kwargs):
        ''' Devuelve el contexto para la plantilla '''
        context = super().get_context_data(**kwargs)
        context['now'] = timezone.now()
        return context

/biblioteca/catalogo/templates/catalogo/book_detail.html

<!-- Dentro de nuestra plantilla para mostrar la fecha actual: -->
<p>Date: {{ now|date }}</p>

Tareas

/catalog/books  # Lista de libros
/catalog/books/1  # Detalle del libro con id 1
/catalog/authors  # Lista de autores
/catalog/authors/1  # Detalle del autor con id 1
/catalog/search  # Formulario de búsqueda de libros (en título, autor por lo menos)

Ideas paginación & bootstrap

Última modificación November 10, 2022: mapas (eba72b5)