¡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".
Debemos "abrir la puerta" para que nuestro modelo Proveedor aparezca en el panel de administración.
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:
from django.contrib import admin
# Register your models here.
Para que nuestro modelo Proveedor
aparezca, necesitamos dos cosas:
Proveedor
. Como admin.py
y models.py
están en la misma carpeta (libreta
), podemos importarlo de forma relativa.Modifica tu archivo libreta/admin.py
para que se vea así:
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).
¡Ahí está! Nuestra app "Libreta" y el modelo "Proveedors" en el admin.
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:
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.
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í).
¡Mucho mejor! Ahora vemos los nombres de los proveedores.
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:
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
).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!
¡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.
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:
¡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
.
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.