Unidad 1
Vitrina estática
Landing HTML+Tailwind: quién soy, qué ofrezco, cómo contactarme.
Unidad 2
Catálogo dinámico
Modelo Servicio en MySQL: los productos/servicios ya viven en la base de datos, no en el HTML.
Unidad 3
Panel privado
CRUD + login: el dueño de la vitrina administra su catálogo desde una sesión autenticada.
Unidad 4
Producto final
Pulido, seguridad y publicación definitiva; se defiende como un producto real, no como una tarea.
Modelo mínimo sugerido (crece libremente por alumno):
# catalogo/models.py
# Comentario de ubicación: este código vive en el archivo models.py de la app "catalogo"
from django.db import models
# Traemos las herramientas de Django para describir tablas como clases de Python
from django.contrib.auth.models import User
# Traemos el modelo de usuario que Django ya trae incluido (login, contraseñas, sesiones)
class Servicio(models.Model):
# Cada clase que hereda de models.Model se convierte en una TABLA dentro de MySQL
propietario = models.ForeignKey(User, on_delete=models.CASCADE)
# Relaciona este servicio con el usuario dueño; on_delete=CASCADE = si se borra el usuario, se borran sus servicios
titulo = models.CharField(max_length=120)
# Texto corto (máximo 120 caracteres), obligatorio
descripcion = models.TextField()
# Texto largo, sin límite fijo de caracteres
precio = models.DecimalField(max_digits=8, decimal_places=2)
# Número decimal: hasta 8 dígitos en total y 2 después del punto (ej. 1500.00)
categoria = models.CharField(max_length=60)
# Texto corto para clasificar el servicio (ej. "Tutorías", "Diseño")
creado_en = models.DateTimeField(auto_now_add=True)
# auto_now_add = Django guarda automáticamente la fecha y hora cuando se crea el registro
def __str__(self):
# Define qué texto se muestra cuando Django necesita "imprimir" este objeto (ej. en el panel /admin)
return self.titulo
# Mostrará el título en vez de algo genérico como "Servicio object (1)"