Café y Código

2. Views: Lógica de Petición y Respuesta 🧠

Las Vistas procesan la lógica de negocio en Django. Reciben una instancia de HttpRequest, procesan datos con el ORM y retornan un objeto HttpResponse.

SUBMÓDULO 2.1

Vistas Basadas en Funciones (FBV - Function Based Views)

Son funciones explícitas de Python. Ofrecen un flujo lineal muy transparente cuando se requiere un control milimétrico sobre cada paso de la petición HTTP:

views_fbv.py
PYTHON
1from django.shortcuts import render, get_object_or_404, redirect
2from django.views.decorators.http import require_http_methods
3from .models import Libro
4
5@require_http_methods(["GET"])
6def libro_detalle_id(request, pk):
7 """FBV que busca por clave primaria. Retorna 404 automático si no existe."""
8 libro = get_object_or_404(Libro, pk=pk)
9
10 # Registro de auditoría
11 print(f"[Auditoría] Consulta libro ID={pk} por IP={request.META.get('REMOTE_ADDR')}")
12
13 return render(request, 'biblioteca/libro_detalle.html', {
14 'libro': libro,
15 'puede_prestar': libro.disponible_para_prestamo and request.user.is_authenticated,
16 })
SUBMÓDULO 2.2

Vistas Basadas en Clases (CBV - Generic Class Based Views)

Las CBVs eliminan código repetitivo (*boilerplate*) mediante herencia. Django incluye vistas genéricas preconstruidas: ListView, DetailView, CreateView, UpdateView y DeleteView.

views_cbv.py
PYTHON
1from django.views.generic import ListView, DetailView
2from django.db.models import Q
3from .models import Libro
4
5# 1. ListView con filtros dinámicos y paginación
6class CatalogoLibrosView(ListView):
7 model = Libro
8 template_name = 'biblioteca/catalogo.html'
9 context_object_name = 'libros'
10 paginate_by = 9
11
12 def get_queryset(self):
13 """Filtra la consulta en la base de datos según los parámetros de la URL."""
14 qs = Libro.objects.select_related('autor', 'categoria').filter(disponible_para_prestamo=True)
15 q = self.request.GET.get('q', '').strip()
16 cat = self.request.GET.get('categoria')
17
18 if q:
19 qs = qs.filter(Q(titulo__icontains=q) | Q(autor__nombre_completo__icontains=q))
20 if cat:
21 qs = qs.filter(categoria__slug=cat)
22 return qs
23
24 def get_context_data(self, **kwargs):
25 """Inyecta variables adicionales al diccionario de contexto del template."""
26 context = super().get_context_data(**kwargs)
27 context['busqueda_actual'] = self.request.GET.get('q', '')
28 context['total_activos'] = self.get_queryset().count()
29 return context
SUBMÓDULO 2.3

Laboratorio Interactivo: Simulador de URLs y Vistas

Prueba en tiempo real cómo el enrutador de Django ejecuta vistas, extrae convertidores, procesa parámetros request.GET y construye el contexto del template:

🌐

Django Views & URLs Laboratory

Prueba rutas, convertidores, parámetros GET y respuestas HTTP en vivo

Proyecto Activo:
📌 Patrón registrado en urls.py:
path("catalogo/", CatalogoLibrosView.as_view(), name="catalogo")
http://127.0.0.1:8000

💡 Puedes editar los parámetros en la URL (ej: cambiar el ID, slug, o los valores de ?q=...) para ver cómo reacciona la vista.

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.