6. Django Admin y Vistas CRUD ⚙️
1. El Panel Administrativo de Django (Django Admin)
Uno de los mayores superpoderes de Django frente a otros frameworks backend es su panel de administración automático (django.contrib.admin). Lee los metadatos de tus modelos y genera al instante una interfaz web completa para crear, buscar, filtrar y editar registros.
1.1 Creación del Superusuario
Para ingresar al panel de administración necesitas una cuenta con privilegios de superusuario (is_superuser = True). Ejecuta en tu terminal con el entorno virtual (venv) activo:
1.2 Registro Profesional de Modelos en admin.py
Registrar un modelo con admin.site.register(Libro) solo ofrece una vista básica. En proyectos reales configuramos clases ModelAdmin con tablas interactivas, filtros laterales, búsquedas optimizadas e inlines para editar registros relacionados en la misma pantalla:
2. Arquitectura de Cada Vista CRUD (Create, Read, Update, Delete)
El acrónimo CRUD define las cuatro operaciones fundamentales sobre cualquier base de datos:
GET y procesa la carga de datos en base de datos mediante POST con validaciones de tipo e integridad.ListView) o en fichas individuales (DetailView).instance=obj), permite modificar sus atributos y aplica validaciones antes de guardar.POST para prevenir borrados accidentales y ejecuta obj.delete() con chequeo de integridad referencial.2.1 Formularios Basados en Modelos (ModelForm)
En Django, no escribes formularios HTML a mano. Utilizas forms.ModelForm, que genera los campos, etiquetas y validaciones directamente a partir de la definición de tu modelo:
2.2 Implementación de Cada Vista CRUD (FBV vs CBV)
A continuación comparamos cómo se implementan las 4 operaciones mediante funciones (FBV) y mediante clases genéricas (CBV):
⚡ Laboratorio Interactivo: Simulador de Django Admin y CRUD
Experimenta el ciclo de vida completo de un CRUD en tiempo real: crea registros pasando por las validaciones de clean(), busca y filtra como en Django Admin, edita instancias existentes y elimina elementos con confirmación.
Django Admin & CRUD Simulator
Experimenta el panel administrativo, formularios y ciclo Create-Read-Update-Delete
| ID | Título del Libro | Categoría | Precio Venta | Costo | Stock | Estado | Acciones CRUD | |
|---|---|---|---|---|---|---|---|---|
| #1 | Clean Code: Manual de desarrollo ágil | Ingeniería | $45.00 | $28.00 | 4 u. | ● Activo | ||
| #2 | Python Fluente 2da Edición | Backend | $65.00 | $42.00 | 2 u. | ● Activo | ||
| #3 | Django 5 Profesional | Backend | $55.00 | $34.00 | 6 u. | ● Activo | ||
| #4 | Patrones de Diseño (GoF) | Arquitectura | $50.00 | $30.00 | 0 u. | ○ Inactivo |
3. Ejercicios Didácticos: Proyecto 1 (Biblioteca)
Aplica las técnicas de administración y formularios sobre el dominio de la biblioteca.
Ejercicio 3.1: Formulario con Validación de Préstamos
Crea un ModelForm para SolicitudPrestamo que impida fijar una fecha de devolución superior a 30 días en el futuro.
Ver Solución Explicada
Ejercicio 3.2: Acción Personalizada en Django Admin con Mensajes
Escribe una acción en SolicitudPrestamoAdmin que permita seleccionar múltiples solicitudes atrasadas y condonar sus multas acumuladas poniéndolas en $0.00.
Ver Solución Explicada
4. Desafío Práctico: Segundo Proyecto — Tienda Online (`tienda`) 🛒
Implementa el panel administrativo y los formularios CRUD del segundo proyecto ubicado en C:\proyectos\django\tienda.
Reto 4.1: PedidoAdmin con TabularInline de Ítems y Acción de Despacho
En pedidos/admin.py, registra Pedido con una relación tabular de ItemPedidoInline para ver los productos comprados, cantidades y subtotales en la misma vista de administración. Añade una acción para marcar los pedidos seleccionados como 'ENVIADO'.
Ver Solución Explicada
Reto 4.2: ModelForm con Validación Cruzada (Precio vs Costo)
En catalogo/forms.py, crea ProductoForm garantizando que: 1. El SKU se guarde siempre en mayúsculas y tenga al menos 4 caracteres. 2. El precio de venta nunca sea inferior al costo de adquisición.
Ver Solución Explicada
Reto 4.3: Vista de Eliminación Suave (Soft Delete)
En comercio electrónico nunca se borra físicamente un producto si ya forma parte del historial de compras de clientes pasados (provocaría error de integridad referencial). Escribe una vista FBV desactivar_producto(request, pk) que al recibir un POST cambie disponible = False en vez de ejecutar delete().
Ver Solución Explicada
Ponte a prueba
Comprueba que dominas el panel de administración, la arquitectura CRUD y la validación de formularios en Django.


