Café y Código

4. Ejercicios y Desafíos Prácticos 🛠️

Pon a prueba y consolida tu aprendizaje resolviendo los ejercicios didácticos basados en nuestros dos proyectos del curso: Biblioteca Central y Tienda E-Commerce.

SUBMÓDULO 4.1

Ejercicios Didácticos: Proyecto 1 (Biblioteca Central) 📚

Ejercicio 1.1: Ruta con Convertidor para Código ISBN

Registra en biblioteca/urls.py una ruta que capture un código ISBN usando el convertidor personalizado isbn y lo envíe a la vista views.libro_por_isbn.

Ver Solución Explicada
solucion_isbn_url.py
PYTHON
1# biblioteca/urls.py
2from django.urls import path, register_converter
3from . import converters, views
4
5register_converter(converters.ISBNConverter, 'isbn')
6
7urlpatterns = [
8 path('libro/isbn/<isbn:codigo>/', views.libro_por_isbn, name='libro_por_isbn'),
9]

Clave didáctica: Primero se registra el convertidor con register_converter asociándolo al alias 'isbn'. Luego se utiliza en la sintaxis de ruta como <isbn:codigo>.

Ejercicio 1.2: FBV con Filtro Múltiple de Etiquetas (request.GET.getlist)

Implementa una FBV buscar_por_tags(request) que reciba parámetros como ?tag=python&tag=backend y filtre los libros que contengan cualquiera de esos tags.

Ver Solución Explicada
solucion_tags_fbv.py
PYTHON
1# biblioteca/views.py
2from django.shortcuts import render
3from .models import Libro
4
5def buscar_por_tags(request):
6 tags_solicitados = request.GET.getlist('tag')
7 qs = Libro.objects.filter(disponible_para_prestamo=True)
8 if tags_solicitados:
9 qs = qs.filter(tags__nombre__in=tags_solicitados).distinct()
10
11 return render(request, 'biblioteca/libros_por_tag.html', {
12 'libros': qs,
13 'tags_activos': tags_solicitados,
14 'total': qs.count()
15 })
SUBMÓDULO 4.2

Desafío Práctico: Segundo Proyecto — Tienda Online (`tienda`) 🛒

📦 Ubicación del proyecto: C:\proyectos\django\tienda (Apps catalogo y pedidos).

Reto 2.1: Enrutamiento Desacoplado con Namespace en la Tienda

Configura las rutas de la tienda para responder bajo el prefijo /catalogo/ con el namespace tienda_catalogo.

Ver Solución Explicada
tienda_urls.py
PYTHON
1# tienda/urls.py
2from django.urls import path, include
3
4urlpatterns = [
5 path('catalogo/', include(('catalogo.urls', 'catalogo'), namespace='tienda_catalogo')),
6]

Reto 2.2: CBV ListView con Filtros de Precio y Búsqueda Cruzada

Implementa CatalogoProductosView(ListView) para filtrar por búsqueda (q), categoría (categoria) y precio máximo (precio_max).

Ver Solución Explicada
catalogo_view_tienda.py
PYTHON
1# catalogo/views.py
2from django.views.generic import ListView
3from django.db.models import Q
4from .models import Producto
5
6class CatalogoProductosView(ListView):
7 model = Producto
8 template_name = 'catalogo/catalogo.html'
9 context_object_name = 'productos'
10 paginate_by = 12
11
12 def get_queryset(self):
13 qs = Producto.objects.select_related('categoria').filter(disponible=True)
14 q = self.request.GET.get('q', '').strip()
15 categoria_slug = self.request.GET.get('categoria')
16 precio_max = self.request.GET.get('precio_max')
17
18 if q:
19 qs = qs.filter(Q(nombre__icontains=q) | Q(descripcion__icontains=q))
20 if categoria_slug:
21 qs = qs.filter(categoria__slug=categoria_slug)
22 if precio_max:
23 try:
24 qs = qs.filter(precio__lte=float(precio_max))
25 except ValueError:
26 pass
27 return qs

Reto 2.3: Vista de Rastreo Seguro con Token UUID (FBV)

Implementa rastreo_pedido(request, tracking) en pedidos/views.py que reciba un token UUID capturado con <uuid:tracking>.

Ver Solución Explicada
rastreo_pedido_view.py
PYTHON
1# pedidos/views.py
2from django.shortcuts import render, get_object_or_404
3from .models import Pedido
4
5def rastreo_pedido(request, tracking):
6 pedido = get_object_or_404(Pedido, numero_seguimiento=tracking)
7 return render(request, 'pedidos/rastreo.html', {'pedido': pedido})
SUBMÓDULO 4.3

Evaluación de Conocimientos 📝

Responde este cuestionario interactivo para poner a prueba tus conocimientos sobre arquitectura MVT, enrutamiento, vistas y plantillas en Django:

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