<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Matias Rojas</title>
    <description>The latest articles on DEV Community by Matias Rojas (@matiasrojas_a).</description>
    <link>https://dev.to/matiasrojas_a</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2993676%2Fa1253454-b62b-49bf-ad49-c73f1d314e68.jpg</url>
      <title>DEV Community: Matias Rojas</title>
      <link>https://dev.to/matiasrojas_a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matiasrojas_a"/>
    <language>en</language>
    <item>
      <title>¿Cómo documentar sistemas empresariales?</title>
      <dc:creator>Matias Rojas</dc:creator>
      <pubDate>Sat, 06 Dec 2025 19:19:55 +0000</pubDate>
      <link>https://dev.to/matiasrojas_a/como-documentar-sistemas-empresariales-3mjj</link>
      <guid>https://dev.to/matiasrojas_a/como-documentar-sistemas-empresariales-3mjj</guid>
      <description>&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;En el mundo real, &lt;strong&gt;muy pocos desarrolladores documentan sus sistemas&lt;/strong&gt; con el mismo nivel de importancia que el código.&lt;br&gt;&lt;br&gt;
Y sin documentación, un sistema empresarial &lt;strong&gt;no es un producto completo&lt;/strong&gt;, sino apenas un conjunto de funciones que solo entiende quien lo construyó.&lt;/p&gt;

&lt;p&gt;La documentación no es un extra: &lt;strong&gt;es parte del sistema&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Ayuda a escalar equipos, simplifica auditorías, reduce la rotación costosa y preserva el conocimiento crítico del negocio.&lt;/p&gt;

&lt;p&gt;En este artículo vas a ver &lt;strong&gt;cómo documentar un sistema empresarial de manera profesional&lt;/strong&gt;, qué tipos de documentación son obligatorios y cómo integrarlos en la operación diaria.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Documentación funcional
&lt;/h2&gt;

&lt;p&gt;La documentación funcional explica &lt;strong&gt;qué hace el sistema&lt;/strong&gt;, &lt;strong&gt;por qué lo hace&lt;/strong&gt; y &lt;strong&gt;cómo debería comportarse&lt;/strong&gt; desde el punto de vista del negocio.&lt;/p&gt;

&lt;p&gt;Es la documentación que podrían leer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product owners
&lt;/li&gt;
&lt;li&gt;Stakeholders
&lt;/li&gt;
&lt;li&gt;Analistas de negocio
&lt;/li&gt;
&lt;li&gt;Nuevos desarrolladores
&lt;/li&gt;
&lt;li&gt;QA / testers
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ¿Qué debe incluir?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Objetivo del sistema:&lt;/strong&gt; qué problema resuelve y para quién
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actores:&lt;/strong&gt; usuarios, roles, permisos
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Casos de uso:&lt;/strong&gt; qué debe poder hacer cada tipo de usuario
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reglas de negocio:&lt;/strong&gt; descuentos, validaciones, autorizaciones, cálculos
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escenarios excepcionales:&lt;/strong&gt; qué ocurre cuando algo falla (stock insuficiente, pago rechazado, datos incompletos)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esta documentación debe responder preguntas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✔ &lt;strong&gt;¿Cómo funciona?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✔ &lt;strong&gt;¿Qué pasa cuando ocurre X?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✔ &lt;strong&gt;¿Por qué esta regla existe así?&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Documentación técnica
&lt;/h2&gt;

&lt;p&gt;La documentación técnica explica &lt;strong&gt;cómo está construido el sistema&lt;/strong&gt;, &lt;strong&gt;qué decisiones arquitectónicas se tomaron&lt;/strong&gt; y &lt;strong&gt;cómo funciona internamente&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Está dirigida a &lt;strong&gt;desarrolladores&lt;/strong&gt;, &lt;strong&gt;DevOps&lt;/strong&gt; y &lt;strong&gt;arquitectos&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué debe incluir?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Arquitectura general&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Monolito, microservicios, colas, workers, integraciones externas, cron jobs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Diagrama de componentes&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Cómo se conectan los módulos internos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dependencias críticas&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
APIs externas, servicios de terceros, librerías esenciales.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flujos técnicos relevantes&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Procesamiento de pagos, sincronización de inventario, generación de reportes, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Infraestructura&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ambientes productivo y staging, CI/CD, backups, escalabilidad.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Políticas técnicas&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Versionado, seguridad, encriptación, manejo de errores.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Diccionario de datos
&lt;/h2&gt;

&lt;p&gt;El diccionario de datos describe &lt;strong&gt;las entidades del sistema&lt;/strong&gt;, sus &lt;strong&gt;campos&lt;/strong&gt; y la &lt;strong&gt;lógica asociada&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Es indispensable en sistemas empresariales, especialmente &lt;strong&gt;contables&lt;/strong&gt;, &lt;strong&gt;logísticos&lt;/strong&gt; y &lt;strong&gt;financieros&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué debe incluir para cada tabla o modelo?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nombre de la entidad&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Propósito&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Campos:&lt;/strong&gt; nombre, tipo, descripción&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reglas asociadas:&lt;/strong&gt; únicos, constraints, validaciones&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Relación con otras entidades&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Impacto en la lógica del negocio&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un buen diccionario de datos permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✔ &lt;strong&gt;Evitar campos huérfanos o duplicados&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✔ &lt;strong&gt;Mantener integridad en los reportes&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✔ &lt;strong&gt;Asegurar que todos entienden la misma semántica&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por ejemplo, el campo &lt;code&gt;importe_total&lt;/code&gt; puede significar cosas distintas si no se define:&lt;br&gt;&lt;br&gt;
subtotal, total con impuestos, total sin descuentos, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Flujos de estados
&lt;/h2&gt;

&lt;p&gt;Los sistemas maduros definen &lt;strong&gt;estados y transiciones claras&lt;/strong&gt;: pedidos, pagos, usuarios, tickets, envíos, facturas, etc.&lt;/p&gt;

&lt;p&gt;Documentar los flujos de estado permite entender:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Qué estados existen&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qué reglas permiten pasar de un estado a otro&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qué estados son finales&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qué estados dependen de validaciones externas&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qué procesos automáticos intervienen&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sin un flujo documentado, cada área del negocio interpreta el estado a su manera, lo que genera &lt;strong&gt;inconsistencias&lt;/strong&gt;, &lt;strong&gt;reclamos&lt;/strong&gt; y &lt;strong&gt;caos operativo&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Manuales para usuarios internos
&lt;/h2&gt;

&lt;p&gt;Esto incluye:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Soporte
&lt;/li&gt;
&lt;li&gt;Atención al cliente
&lt;/li&gt;
&lt;li&gt;Finanzas
&lt;/li&gt;
&lt;li&gt;Logística
&lt;/li&gt;
&lt;li&gt;Administración
&lt;/li&gt;
&lt;li&gt;Supervisores
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Los manuales internos deben explicar:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pasos para cada acción frecuente&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Errores comunes y cómo resolverlos&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permisos según rol&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Procedimientos del día a día&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ejemplos visuales y capturas de pantalla&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mejores prácticas operativas&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Scripts de auditoría
&lt;/h2&gt;

&lt;p&gt;Los scripts de auditoría permiten:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Volver a calcular montos&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validar integridad&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Detectar inconsistencias&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comparar estados actuales vs históricos&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reconstruir operaciones críticas&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tipos típicos de auditoría:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ventas vs facturación&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stock teórico vs stock real&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integridad de registros:&lt;/strong&gt; órdenes sin pago, pagos sin orden
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repetición de cálculos históricos&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logs de acciones críticas&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estos scripts deben estar &lt;strong&gt;documentados, versionados y probados&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Un sistema empresarial bien documentado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✔ Reduce el soporte
&lt;/li&gt;
&lt;li&gt;✔ Evita errores caros
&lt;/li&gt;
&lt;li&gt;✔ Alinea al negocio
&lt;/li&gt;
&lt;li&gt;✔ Facilita auditorías
&lt;/li&gt;
&lt;li&gt;✔ Acelera onboarding
&lt;/li&gt;
&lt;li&gt;✔ Aumenta la calidad del software
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La documentación es un &lt;strong&gt;componente más del sistema&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Gracias por leer 🙌&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Modernizá tu Django Admin con Unfold (sin tocar una línea de CSS)</title>
      <dc:creator>Matias Rojas</dc:creator>
      <pubDate>Mon, 31 Mar 2025 01:41:17 +0000</pubDate>
      <link>https://dev.to/matiasrojas_a/moderniza-tu-django-admin-con-unfold-sin-tocar-una-linea-de-css-3g6g</link>
      <guid>https://dev.to/matiasrojas_a/moderniza-tu-django-admin-con-unfold-sin-tocar-una-linea-de-css-3g6g</guid>
      <description>&lt;h2&gt;
  
  
  ¿Qué es Unfold?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://unfoldadmin.com/" rel="noopener noreferrer"&gt;Unfold&lt;/a&gt; es una interfaz moderna para el Django Admin, construida con &lt;strong&gt;Tailwind CSS&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Está diseñada para ofrecer una experiencia visual más atractiva y una mejor usabilidad, sin necesidad de escribir código frontend.&lt;/p&gt;

&lt;p&gt;Lo mejor de todo: &lt;strong&gt;no tenés que cambiar la lógica de tus modelos, ni usar React, ni crear templates personalizados&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Solo con unas pocas configuraciones, ya podés transformar el aspecto de tu panel administrativo.&lt;/p&gt;
&lt;h3&gt;
  
  
  🔧 ¿Qué ofrece Unfold?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dashboard con &lt;strong&gt;métricas&lt;/strong&gt; y paneles personalizables&lt;/li&gt;
&lt;li&gt;Diseño &lt;strong&gt;responsive&lt;/strong&gt; por defecto&lt;/li&gt;
&lt;li&gt;Personalización visual desde Python, sin tocar HTML o CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es una solución ideal para quienes trabajamos desde el backend, pero queremos entregar un producto final más pulido y profesional.&lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;Podés ver la demo oficial en:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://demo.unfoldadmin.com/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Diferencias entre el Admin clásico y Unfold
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefddniqj4jqq77ckvefg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefddniqj4jqq77ckvefg.png" alt="admin clásico"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv1opddp6hlagp55v25ag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv1opddp6hlagp55v25ag.png" alt="admin unfold"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Django viene con un panel administrativo muy funcional, pero con una estética básica y pocas herramientas visuales listas para usar.&lt;br&gt;&lt;br&gt;
Unfold no reemplaza el admin clásico, sino que lo &lt;strong&gt;mejora desde adentro&lt;/strong&gt;, aplicando un diseño moderno y nuevas formas de presentar los datos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Diferencias Clave&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Característica&lt;/th&gt;
&lt;th&gt;Django Admin clásico&lt;/th&gt;
&lt;th&gt;Django Admin con Unfold&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Estética&lt;/td&gt;
&lt;td&gt;Simple, minimalista&lt;/td&gt;
&lt;td&gt;Moderna, basada en Tailwind CSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Layout&lt;/td&gt;
&lt;td&gt;Vertical, lineal&lt;/td&gt;
&lt;td&gt;Responsive, adaptable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Personalización visual&lt;/td&gt;
&lt;td&gt;Requiere CSS/JS&lt;/td&gt;
&lt;td&gt;Desde Python, sin CSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dashboard&lt;/td&gt;
&lt;td&gt;Estático, sin métricas&lt;/td&gt;
&lt;td&gt;Paneles con métricas y widgets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Responsive&lt;/td&gt;
&lt;td&gt;Limitado&lt;/td&gt;
&lt;td&gt;Totalmente adaptable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integración con &lt;code&gt;ModelAdmin&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Total&lt;/td&gt;
&lt;td&gt;Total (hereda de ModelAdmin)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requiere cambiar tu flujo de trabajo&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;🔍 En resumen: &lt;strong&gt;Unfold respeta todo lo bueno del admin clásico&lt;/strong&gt;, pero te da herramientas visuales listas para usar con solo un par de configuraciones.&lt;/p&gt;

&lt;p&gt;Este cambio es ideal tanto para proyectos personales como para paneles internos de clientes o equipos de trabajo, donde la presentación también importa.&lt;/p&gt;
&lt;h2&gt;
  
  
  Instalación
&lt;/h2&gt;

&lt;p&gt;Ejecute el siguiente comando en su entorno virtual para instalar Unfold:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install django-unfold
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Después de una instalación exitosa, agregue Unfold a INSTALLED_APPS en el archivo Django settings.py.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INSTALLED_APPS = [
    "unfold",  # Debe ir antes que django.contrib.admin
    "unfold.contrib.filters",          # Opcional: filtros personalizados
    "unfold.contrib.forms",            # Opcional: mejoras en formularios
    "unfold.contrib.inlines",          # Opcional: mejoras en inlines
    "unfold.contrib.import_export",    # Opcional: si usás django-import-export
    "unfold.contrib.guardian",         # Opcional: si usás django-guardian
    "unfold.contrib.simple_history",   # Opcional: si usás django-simple-history
    "django.contrib.admin",            # Requerido
    ...
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 &lt;strong&gt;Podés ver todas las opciones de configuración en:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://unfoldadmin.com/docs/configuration/settings/" rel="noopener noreferrer"&gt;Documentación&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La próxima vez que visites tu panel de administración, serás recibido con una interfaz moderna, limpia y responsive.&lt;/p&gt;
&lt;h2&gt;
  
  
  Personalización de un modelo
&lt;/h2&gt;

&lt;p&gt;Este es el único paso importante que sí cambia respecto al admin clásico:&lt;br&gt;
Las clases admin deben heredar de &lt;strong&gt;unfold.admin.ModelAdmin&lt;/strong&gt;, no del &lt;strong&gt;django.contrib.admin.ModelAdmin&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Ejemplo Django Clásico:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.contrib import admin
from .models import Autor

@admin.register(Autor)
class AutorAdmin(admin.ModelAdmin):
    list_display = ("nombre", "nacionalidad")
    search_fields = ("nombre", "nacionalidad")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Ejemplo Unfold:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.contrib import admin
from unfold.admin import ModelAdmin
from .models import Autor

@admin.register(Autor)
class AutorAdmin(ModelAdmin):
    list_display = ("nombre", "nacionalidad")
    search_fields = ("nombre", "nacionalidad")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flo32wyktkeyei0kjv3m3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flo32wyktkeyei0kjv3m3.png" alt="modelo unfold"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Funciones destacadas
&lt;/h2&gt;

&lt;p&gt;No es necesario modificar ajustes adicionales, pero se puede lograr mucho haciendolo. Dado que unfold sobrescribe algunos comportamientos predeterminados, los desarrolladores lograron añadir funcionalidades adicionales al panel de administración de Django. A continuación, destacaré mis dos favoritas: la barra lateral personalizada y el dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Barra Lateral
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35lazvmdhjckuqqp6fpn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35lazvmdhjckuqqp6fpn.png" alt="sidebar"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unfold te permite estructurar la navegación de la barra lateral a tu gusto. Por defecto, se ven los modelos registrados uno abajo de otro. Esto puede funcionar bien al principio, pero se vuelve difícil de manejar a medida que se agregan más modelos. Una buena forma de evitarlo es añadir una capa de navegación adicional: las aplicaciones donde residen los modelos.&lt;/p&gt;

&lt;p&gt;En el archivo &lt;strong&gt;conifg/settings.py&lt;/strong&gt;, agregue lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.urls import reverse_lazy
from django.utils.translation import gettext_lazy as _

UNFOLD = {
    "SITE_HEADER": "Admin Libros",

    "SIDEBAR": {
        "show_search": True,
        "show_all_applications": False,
        "navigation": [
            {
                "title": _("Gestión de Libros"),
                "separator": False,
                "collapsible": True,
                "items": [
                    {
                        "title": _("Autores"),
                        "icon": "person",
                        "link": reverse_lazy("admin:books_autor_changelist"),
                    },
                    {
                        "title": _("Libros"),
                        "icon": "menu_book",
                        "link": reverse_lazy("admin:books_libro_changelist"),
                    },
                ],
            },
        ],
    },
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto creará un elemento de navegación plegable, con los modelos registrados. Cada modelo también tiene su propio icono, obtenido de Google Fonts. Verás una barra lateral mucho más ordenada y profesional:&lt;/p&gt;

&lt;h3&gt;
  
  
  Dashboard
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5bga1iwricsvt193vro3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5bga1iwricsvt193vro3.png" alt="dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La característica principal de Unfold es que te permite desarrollar paneles personalizados de forma eficiente. Estos paneles son útiles para supervisar la actividad de tu aplicación, lo que te permite ver lo que sucede en cualquier momento.&lt;/p&gt;

&lt;p&gt;Recomiendo configurar el panel de control como página de inicio del panel de administración, para poder verlo cada vez que se inicia sesión. Para configurarlo, debemos seguir los siguientes pasos:&lt;/p&gt;

&lt;p&gt;actualice el archivo &lt;strong&gt;config/settings.py&lt;/strong&gt; para incluir lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"DASHBOARD_CALLBACK": "config.admin.dashboard_callback",

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Registramos el dashboard en la barra lateral:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"SIDEBAR": {
    "show_search": True,  
    "show_all_applications": False,  
    "navigation": [
            {
                "title": _("Menú Principal"),
                "separator": True,
                "collapsible": True,
                "items": [
                    {
                        "title": _("Dashboard"),
                        "icon": "dashboard",
                        "link": reverse_lazy("admin:index"),
                    },
                ],
            },
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ya que estamos en &lt;strong&gt;settings.py&lt;/strong&gt; también vemos las plantillas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / "config/templates"],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego, creamos el archivo &lt;strong&gt;config/admin.py&lt;/strong&gt; y completamos con lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from books.models import Autor, Libro

def dashboard_callback(request, context):
    """
    Dashboard personalizado para Unfold.
    """
    total_autores = Autor.objects.count()
    total_libros = Libro.objects.count()

    context.update({
        "kpis": [
            {
                "title": "Total de Autores",
                "metric": total_autores,
            },
            {
                "title": "Total de Libros",
                "metric": total_libros,
            },
        ],
    })
    return context
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y por último creamos una plantilla que lo renderice, en &lt;strong&gt;config/templates/admin/index.html&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{% extends "admin/base.html" %}
{% load unfold %}

{% block content %}
  {% component "unfold/components/container.html" %}
    &amp;lt;div class="grid grid-cols-2 gap-4"&amp;gt;
      {% for metric in kpis %}
        {% component "unfold/components/card.html" %}
          {% component "unfold/components/text.html" %}
            {{ metric.title }}
          {% endcomponent %}
          {% component "unfold/components/title.html" %}
            {{ metric.metric }}
          {% endcomponent %}
        {% endcomponent %}
      {% endfor %}
    &amp;lt;/div&amp;gt;
  {% endcomponent %}
{% endblock %}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¡Listo! 🎉&lt;/p&gt;

&lt;p&gt;Al ejecutar el &lt;strong&gt;servidor&lt;/strong&gt; y acceder a &lt;strong&gt;/admin&lt;/strong&gt;, se mostrará el siguiente panel de control.&lt;/p&gt;

&lt;p&gt;Espero que esto te proporcione una idea para desarrollar tus propios &lt;strong&gt;dashboards&lt;/strong&gt; dentro del panel de administración de Django con &lt;strong&gt;Unfold&lt;/strong&gt;. Implementamos algunas funciones útiles, ¡pero no todas! Asegúrate de consultar la &lt;a href="https://unfoldadmin.com/docs/" rel="noopener noreferrer"&gt;documentación&lt;/a&gt; de Unfold para explorar todas las opciones disponibles.&lt;/p&gt;

&lt;p&gt;A continuación les dejo el código completo de esta guía, se encuentra en este &lt;a href="https://github.com/MatiasRojas-ay/django-unfold" rel="noopener noreferrer"&gt;repositorio&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Unfold te permite modernizar el Django Admin con muy poco esfuerzo y sin escribir una sola línea de CSS.&lt;br&gt;&lt;br&gt;
Es simple, potente y perfecto para quienes trabajamos del lado del backend.&lt;/p&gt;

&lt;p&gt;Probalo, personalizalo y llevá tu panel al siguiente nivel.&lt;/p&gt;

&lt;p&gt;Gracias por leer 🙌&lt;/p&gt;

</description>
      <category>django</category>
      <category>unfold</category>
      <category>python</category>
      <category>spanish</category>
    </item>
  </channel>
</rss>
