# creacion-de-aplicaciones-web-en-django-y-python
Creación de Aplicaciones Web en Django y Python
Volver a la portada del cursoProyecto 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
- Modelo nuevo con dueño. Elige una opción: una lista de deseos (cada usuario guarda productos) o un pedido (
Pedidocon variosItemPedido, cada uno con producto, cantidad y precio). El modelo se relaciona con el usuario medianteForeignKeyasettings.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. - 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. - 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 elstockdel producto o un precio máximo negativo. - 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 afloat. - Pruebas. Al menos 6 pruebas con
TestCaseyClientque pasen conpython 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. - Configuración de producción.
SECRET_KEY,DEBUGyALLOWED_HOSTSleídos de variables de entorno. Ejecutapython manage.py check --deployconDJANGO_DEBUG=0y documenta cada advertencia: cuáles corregiste y por qué quedan las demás. - 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
- Corre el proyecto base y comprueba los resultados de referencia de abajo.
- Escribe el modelo nuevo, genera la migración con
makemigrations, revísala consqlmigratey aplícala. - Registra el modelo en el admin y crea algunos datos a mano.
- Escribe el formulario y las vistas con
@login_required; agrega las rutas acatalogo/urls.pycon nombre. - Crea las plantillas extendiendo
base.htmly agrega los enlaces al menú. - Agrega la búsqueda y el endpoint JSON.
- Escribe las pruebas mientras avanzas, no al final.
- Pasa la configuración a variables de entorno y ejecuta
check --deploy. - Escribe el README y pruébalo en una carpeta limpia.
Entregables
- El código del proyecto (carpeta o repositorio), sin
db.sqlite3ni secretos. - Las migraciones nuevas.
README.md.- La salida de
python manage.py testy decheck --deploy, con tus notas sobre cada advertencia.
Rúbrica (100 puntos)
| Criterio | Puntos |
|---|---|
Modelo nuevo: campos adecuados, relación con el usuario, on_delete justificado, admin y migración | 20 |
Vistas protegidas: @login_required y cada usuario ve solo sus datos | 15 |
| Búsqueda y filtro por precio con resultados correctos | 10 |
Formulario con clean_, mensajes claros y CSRF | 15 |
| Endpoint JSON nuevo con estructura clara | 10 |
| Pruebas: al menos 6, incluidos 302 sin sesión, 404 y formulario inválido; todas pasan | 15 |
Configuración por variables de entorno y check --deploy documentado | 10 |
| README que permite instalar y correr el proyecto | 5 |
Extras (opcionales)
- Paginar la búsqueda con
Paginator. - Pintar la lista de deseos con JavaScript y
fetch, como en el notebook. - Usar
select_relatedoprefetch_relatedy medir las consultas conCaptureQueriesContext. - 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).»;migrateen 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 --deployconDJANGO_DEBUG=0: 5 advertencias (W004, W008, W009, W012, W016); 4 con unaSECRET_KEYlarga y aleatoria.