Saltar al contenido

# creacion-de-aplicaciones-web-en-django-y-python

Creación de Aplicaciones Web en Django y Python

Volver a la portada del curso
Proyecto

Proyecto Final: Aplicación Completa

Sección 5 · Proyecto Final

Proyecto final: la tienda web de PyShop, completa

Durante el curso construiste el catálogo web de PyShop: lista de productos, detalle con calificación, reseñas solo para clientes con sesión, panel de administración y un endpoint JSON. El equipo de PyShop ahora pide lo que falta para ponerlo en línea: que los clientes guarden productos, busquen en el catálogo y que la aplicación esté probada y lista para producción.

Objetivo

Extender el proyecto pyshop con una función por capa (modelo, vista, formulario, API, pruebas y configuración) y entregarlo de forma que otra persona pueda instalarlo y correrlo siguiendo solo tu README.

Punto de partida

El proyecto del curso: proyecto pyshop, app catalogo, modelos Categoria, Producto y Resena, y los datos de ejemplo (8 productos, 7 disponibles; usuarios ana y luis). El notebook tienda-pyshop-completa lo crea completo con datos.preparar; también puedes partir de tu propia versión. Usa Django 5.2 (pip install "django==5.2.*") y SQLite.

Requisitos

  1. Modelo nuevo con dueño. Elige una opción: una lista de deseos (cada usuario guarda productos) o un pedido (Pedido con varios ItemPedido, cada uno con producto, cantidad y precio). El modelo se relaciona con el usuario mediante ForeignKey a settings.AUTH_USER_MODEL, tiene __str__, está registrado en el admin y tiene su migración. Las vistas que lo usan requieren sesión, y cada usuario ve solo lo suyo.
  2. Búsqueda y filtro. Una vista que busque productos disponibles por nombre con nombre__icontains (parámetro ?q=) y filtre por precio máximo. Con los datos de ejemplo, buscar «pyshop» debe devolver 4 productos disponibles y un precio máximo de 300, también 4.
  3. Formulario con validación propia. Un formulario con al menos un método clean_<campo> que rechace un valor con un mensaje claro. Por ejemplo, una cantidad mayor que el stock del producto o un precio máximo negativo.
  4. Endpoint JSON nuevo. Por ejemplo, /api/deseos/ con la lista del usuario o /api/productos/?q= con la búsqueda. Devuelve un diccionario con una clave principal y precios convertidos a float.
  5. Pruebas. Al menos 6 pruebas con TestCase y Client que pasen con python manage.py test. Deben incluir: una vista protegida sin sesión (302 al login), un slug inexistente (404), un formulario inválido y el endpoint JSON nuevo.
  6. Configuración de producción. SECRET_KEY, DEBUG y ALLOWED_HOSTS leídos de variables de entorno. Ejecuta python manage.py check --deploy con DJANGO_DEBUG=0 y documenta cada advertencia: cuáles corregiste y por qué quedan las demás.
  7. README. Cómo crear el entorno, instalar, migrar, cargar datos, crear un superusuario, correr el servidor y correr las pruebas, más las variables de entorno necesarias.

Pasos sugeridos

  1. Corre el proyecto base y comprueba los resultados de referencia de abajo.
  2. Escribe el modelo nuevo, genera la migración con makemigrations, revísala con sqlmigrate y aplícala.
  3. Registra el modelo en el admin y crea algunos datos a mano.
  4. Escribe el formulario y las vistas con @login_required; agrega las rutas a catalogo/urls.py con nombre.
  5. Crea las plantillas extendiendo base.html y agrega los enlaces al menú.
  6. Agrega la búsqueda y el endpoint JSON.
  7. Escribe las pruebas mientras avanzas, no al final.
  8. Pasa la configuración a variables de entorno y ejecuta check --deploy.
  9. Escribe el README y pruébalo en una carpeta limpia.

Entregables

  • El código del proyecto (carpeta o repositorio), sin db.sqlite3 ni secretos.
  • Las migraciones nuevas.
  • README.md.
  • La salida de python manage.py test y de check --deploy, con tus notas sobre cada advertencia.

Rúbrica (100 puntos)

CriterioPuntos
Modelo nuevo: campos adecuados, relación con el usuario, on_delete justificado, admin y migración20
Vistas protegidas: @login_required y cada usuario ve solo sus datos15
Búsqueda y filtro por precio con resultados correctos10
Formulario con clean_, mensajes claros y CSRF15
Endpoint JSON nuevo con estructura clara10
Pruebas: al menos 6, incluidos 302 sin sesión, 404 y formulario inválido; todas pasan15
Configuración por variables de entorno y check --deploy documentado10
README que permite instalar y correr el proyecto5

Extras (opcionales)

  • Paginar la búsqueda con Paginator.
  • Pintar la lista de deseos con JavaScript y fetch, como en el notebook.
  • Usar select_related o prefetch_related y medir las consultas con CaptureQueriesContext.
  • Activar las opciones de seguridad que permite tu entorno y mostrar cuántas advertencias quedan.

Resultados de referencia

Con el proyecto base y los datos de ejemplo debes obtener lo siguiente. Si no coincide, revisa el punto de partida antes de agregar código.

  • python manage.py check: «System check identified no issues (0 silenced).»; migrate en una base nueva aplica 19 migraciones.
  • GET / → 200 con 7 productos; /?categoria=ropa → 3.
  • Detalle de la taza → 200 con «Calificación: 4,5 de 5»; producto no disponible o slug inexistente → 404.
  • /api/productos/ → 200, application/json, 7 productos.
  • Reseña sin sesión → 302 a /cuentas/login/?next=/producto/taza-pyshop/resena/; con sesión → 200; POST sin token CSRF → 403.
  • check --deploy con DJANGO_DEBUG=0: 5 advertencias (W004, W008, W009, W012, W016); 4 con una SECRET_KEY larga y aleatoria.

Recursos