Episodio 2, Capítulo 19

Mostrando el Modelo en el Administrador

⏱️ Tiempo de lectura: 9 minutos
🧩 Actividades: 1 (Modificar `admin.py`)
📚 Nivel: Principiante

🚪 Haciendo Visible lo Invisible: Nuestro Modelo en el Admin

¡Ya tenemos nuestra tabla Proveedor definida en models.py y las migraciones aplicadas! Esto significa que la tabla existe físicamente en nuestra base de datos db.sqlite3. Pero si ahora mismo vas al panel de administración de Django (/admin) e inicias sesión, te llevarás una sorpresa: ¡nuestros Proveedores no aparecen por ningún lado!

Esto es porque, por defecto, Django no muestra automáticamente todos los modelos que creas en su panel de administración. ¡Sería un caos si lo hiciera con todas las tablas internas que usa! Nosotros tenemos que decirle explícitamente: "Django, quiero que este modelo Proveedor sea visible y manejable desde el admin".

Puerta semiabierta revelando luz

Debemos "abrir la puerta" para que nuestro modelo Proveedor aparezca en el panel de administración.

🔑 La Llave Maestra: El Archivo admin.py

La magia para hacer visible nuestro modelo sucede en el archivo admin.py que se encuentra dentro de nuestra aplicación libreta (es decir, en libreta/admin.py).

Abre ese archivo en VS Code. Al principio, estará casi vacío, con algunos comentarios:

libreta/admin.py (inicial)

from django.contrib import admin

# Register your models here.
                        

Para que nuestro modelo Proveedor aparezca, necesitamos dos cosas:

  1. Importar nuestro modelo: Primero, tenemos que decirle a este archivo dónde encontrar la definición de nuestro modelo Proveedor. Como admin.py y models.py están en la misma carpeta (libreta), podemos importarlo de forma relativa.
  2. Registrar el modelo: Luego, tenemos que "registrar" nuestro modelo con el sitio de administración de Django.

Modifica tu archivo libreta/admin.py para que se vea así:

libreta/admin.py (modificado)

from django.contrib import admin
from .models import Proveedor # 1. Importamos nuestro modelo Proveedor

# Register your models here.
admin.site.register(Proveedor) # 2. Registramos el modelo
                        

Analicemos:

  • from .models import Proveedor: El punto . antes de models significa "desde el directorio actual" (es decir, desde la app libreta), importa el archivo models.py, y de ahí, trae la clase Proveedor que definimos.
  • admin.site.register(Proveedor): Esta es la línea mágica. admin.site es el objeto que representa el sitio de administración de Django, y con el método register() le estamos diciendo: "Oye, sitio de admin, por favor registra y encárgate de este modelo llamado Proveedor".

¡No olvides guardar el archivo admin.py!

Ahora, si tu servidor de desarrollo está corriendo (python manage.py runserver), ve a tu navegador y refresca la página del panel de administración (http://127.0.0.1:8000/admin). Si no estaba corriendo, inícialo.

¡Deberías ver una nueva sección! Bajo nuestra app "LIBRETA" (Django suele poner el nombre de la app en mayúsculas aquí), ahora aparecerá "Proveedors" (Django pluraliza el nombre del modelo por defecto, a veces en inglés).

Panel de admin de Django mostrando el modelo Proveedores

¡Ahí está! Nuestra app "Libreta" y el modelo "Proveedors" en el admin.

🧐 Explorando Nuestros "Proveedors"

Haz clic en el enlace "Proveedors". Como todavía no hemos agregado ningún proveedor, la lista estará vacía, pero verás un botón "AÑADIR PROVEEDOR". ¡Pruébalo!

Verás un formulario con los campos que definimos en models.py: Nombre, Direccion, Email y Telefono. Fíjate que "Nombre" no tiene la indicación "(Opcional)" porque lo definimos con blank=False, null=False, mientras que los otros sí aparecen como opcionales.

Intenta agregar un par de proveedores de prueba. Por ejemplo:

  • Proveedor 1:
    • Nombre: Ferretería El Tornillo Feliz
    • Direccion: Av. Siempreviva 123
    • Email: [email protected]
    • Telefono: 1122334455
  • Proveedor 2:
    • Nombre: Papelera El Resplandor
    • (Deja los otros campos en blanco si quieres)

Después de guardarlos, volverás a la lista de proveedores. Pero... ¡oh! La lista muestra algo como "Proveedor object (1)", "Proveedor object (2)". No es muy descriptivo, ¿verdad? Sería mucho mejor si viéramos el nombre del proveedor directamente en la lista.

Lista de Proveedores en el admin mostrando 'Proveedor object'

Por defecto, la lista de objetos no es muy informativa.

¿Recuerdas esa función __str__(self) que agregamos a nuestro modelo Proveedor en models.py?


class Proveedor(models.Model):
    # ... nuestros campos ...
    def __str__(self):
        return self.nombre
                    

Esa función le dice a Django qué mostrar cuando necesita una representación en texto de un objeto Proveedor. ¡Y el panel de administración la usa aquí! Gracias a ella, en lugar de "Proveedor object (ID)", ahora deberías ver el nombre de cada proveedor en la lista si refrescas la página del admin (o si ya lo tenías definido así).

Lista de Proveedores mostrando nombres gracias a __str__

¡Mucho mejor! Ahora vemos los nombres de los proveedores.

🎨 Personalizando la Lista: list_display

Ver el nombre está bien, pero ¿y si quisiéramos ver más información directamente en la lista, como el email o el teléfono, sin tener que hacer clic en cada proveedor?

Podemos personalizar cómo se ve esta lista en el admin. Para esto, modificaremos un poco nuestro archivo libreta/admin.py. En lugar de la simple línea admin.site.register(Proveedor), vamos a crear una clase especial que nos permita configurar más opciones:

libreta/admin.py (con personalización)

from django.contrib import admin
from .models import Proveedor

@admin.register(Proveedor) # Usamos un decorador para registrar
class ProveedorAdmin(admin.ModelAdmin):
    list_display = ('nombre', 'email', 'telefono', 'direccion') # Campos a mostrar en la lista
    # Si solo quieres un campo, recuerda la coma: list_display = ('nombre',)
                        

Desmenucemos los cambios:

  • @admin.register(Proveedor): Esto se llama un "decorador". Es una forma elegante en Python de modificar o extender el comportamiento de la clase que viene justo después (ProveedorAdmin). Aquí, le estamos diciendo a Django: "Registra el modelo Proveedor usando las configuraciones de esta clase ProveedorAdmin".
  • class ProveedorAdmin(admin.ModelAdmin):: Creamos una nueva clase llamada ProveedorAdmin (el nombre es una convención, podría ser otro, pero es bueno seguirla). Esta clase debe heredar de admin.ModelAdmin, que es la clase base de Django para personalizar el admin.
  • list_display = ('nombre', 'email', 'telefono', 'direccion'): ¡Esta es la clave! list_display es un atributo especial que le dice a Django qué campos del modelo Proveedor queremos que se muestren como columnas en la página de la lista de proveedores. Es una tupla (una lista que no se puede modificar, se escribe con paréntesis) de los nombres de los campos (tal cual los definiste en models.py).
  • Nota sobre la tupla de un solo elemento: Si solo quisieras mostrar un campo en list_display, por ejemplo, solo el nombre, tendrías que escribirlo con una coma al final para que Python entienda que es una tupla: list_display = ('nombre',). Sin la coma, Python pensaría que es solo una cadena de texto entre paréntesis y daría error.

Guarda el archivo libreta/admin.py. Si tu servidor está corriendo, Django debería detectar el cambio y recargarse. Si no, reinícialo. Ahora, ve a la lista de Proveedores en el panel de administración (/admin/libreta/proveedor/) y... ¡magia!

Lista de Proveedores con columnas personalizadas usando list_display

¡Ahora nuestra lista de proveedores muestra la información que queremos!

Ahora verás columnas para Nombre, Email, Teléfono y Dirección. ¡Mucho más útil! Puedes hacer clic en los encabezados de las columnas para ordenar la lista por ese campo.

¡CRUD Completo sin Programar (casi)!

Fíjate que con solo definir nuestro modelo en models.py y registrarlo (con una pequeña personalización) en admin.py, Django ya nos dio:

  • Una forma de Crear nuevos proveedores (el botón "AÑADIR PROVEEDOR").
  • Una forma de Rleer (ver) la lista de proveedores y el detalle de cada uno.
  • Una forma de Uactualizar los datos de un proveedor (haciendo clic en uno y modificando su formulario).
  • Una forma de Deliminar proveedores (seleccionándolos en la lista y usando la acción de "Eliminar seleccionados").

¡Tenemos un sistema CRUD (Crear, Leer, Actualizar, Eliminar) completamente funcional para nuestros proveedores, y casi no hemos escrito lógica para ello! Esa es la potencia del admin de Django.

El video de este capítulo te muestra cómo registrar el modelo y personalizar la vista de lista con list_display.

Pequeño Resumen del Capítulo 19 (Episodio 2)

Para que tus modelos aparezcan en el panel de administración de Django, debes "registrarlos". Esto se hace en el archivo admin.py de tu aplicación. Primero, importas tu modelo (ej: from .models import Proveedor). Luego, puedes usar admin.site.register(Proveedor) para un registro básico. Para personalizar cómo se ve la lista de tus objetos (ej: proveedores), es mejor crear una clase que herede de admin.ModelAdmin, usar el decorador @admin.register(Proveedor) sobre ella, y definir el atributo list_display como una tupla con los nombres de los campos que quieres mostrar como columnas. ¡Django te da la funcionalidad CRUD gratis!

El panel de administración es muy configurable. En el próximo capítulo, veremos un par de trucos más para hacerlo aún más útil, como agregar filtros y un buscador.