En el capítulo anterior, logramos que nuestro modelo Proveedor apareciera en el panel de administración y personalizamos las columnas que se muestran en la lista usando list_display. ¡Eso ya es un gran avance! Pero el admin de Django es como una navaja suiza: tiene muchas más herramientas para hacernos la vida más fácil, especialmente cuando empezamos a tener muchos registros (muchos proveedores, en nuestro caso).
Hoy vamos a explorar dos personalizaciones muy útiles que podemos agregar a nuestra clase ProveedorAdmin en el archivo libreta/admin.py: los filtros y el buscador.
Añadir filtros y un buscador es como darle una lupa y mejores herramientas de organización a nuestro panel de administración.
list_filterImagina que tienes cientos o miles de proveedores. Encontrar uno específico o ver solo aquellos que cumplen ciertos criterios (por ejemplo, todos los de una ciudad) podría ser tedioso si solo puedes ordenar por columnas. ¡Aquí es donde entra list_filter!
El atributo list_filter en nuestra clase ProveedorAdmin nos permite agregar una barra lateral en la página de la lista de proveedores con opciones para filtrar los resultados basados en los campos que elijamos.
Vamos a modificar nuestro libreta/admin.py. Si quisiéramos poder filtrar nuestros proveedores por el campo "nombre" (aunque para nombres únicos no es el mejor ejemplo, nos sirve para ilustrar), haríamos esto:
from django.contrib import admin
from .models import Proveedor
@admin.register(Proveedor)
class ProveedorAdmin(admin.ModelAdmin):
list_display = ('nombre', 'email', 'telefono', 'direccion')
list_filter = ('nombre',) # ¡Nueva línea! Filtro por nombre
Al igual que list_display, list_filter debe ser una tupla de nombres de campos (strings) que existen en tu modelo Proveedor. Si solo pones un campo, ¡no olvides la coma al final para que Python sepa que es una tupla!
Guarda el archivo. Si tu servidor está corriendo, debería recargarse. Ahora, ve a la lista de Proveedores en el admin (/admin/libreta/proveedor/). Deberías ver una nueva barra lateral a la derecha titulada "Filtrar" (o "Filter") con opciones basadas en los nombres de tus proveedores.
El panel de administración ahora con la opción de filtrar por nombre a la derecha.
list_filter es especialmente útil para campos que tienen un número limitado de opciones (como un campo de "estado" con opciones "activo"/"inactivo", o un campo de "país") o para campos de fecha (Django automáticamente provee filtros inteligentes como "Hoy", "Últimos 7 días", etc.).
search_fieldsOtra herramienta súper útil para manejar muchos datos es un campo de búsqueda. ¿Y si queremos encontrar rápidamente a todos los proveedores que tengan "Feliz" en su nombre o que estén en una dirección que contenga "Avenida Siempreviva"? Para esto, usamos search_fields.
search_fields le dice a Django en qué campos de tu modelo debe buscar cuando el usuario escribe algo en la barra de búsqueda que aparecerá en la parte superior de la lista.
Agreguemos un buscador a nuestro ProveedorAdmin para buscar por nombre y dirección:
from django.contrib import admin
from .models import Proveedor
@admin.register(Proveedor)
class ProveedorAdmin(admin.ModelAdmin):
list_display = ('nombre', 'email', 'telefono', 'direccion')
list_filter = ('nombre',)
search_fields = ('nombre', 'direccion') # ¡Nueva línea! Buscador
search_fields también es una tupla de nombres de campos. Django buscará el texto ingresado por el usuario dentro de los campos que especifiques aquí. La búsqueda no distingue entre mayúsculas y minúsculas por defecto.
Guarda el archivo, asegúrate de que tu servidor esté corriendo (o reinícialo), y refresca la página de la lista de Proveedores en el admin. ¡Ahora deberías ver una barra de búsqueda en la parte superior!
¡Ahora podemos buscar proveedores por nombre o dirección directamente!
Prueba a escribir parte del nombre de un proveedor o parte de una dirección y presiona Enter o haz clic en el botón de buscar. Django te mostrará solo los resultados que coincidan.
list_display, list_filter, y search_fields son solo el comienzo. El ModelAdmin de Django ofrece muchísimas más opciones para personalizar cómo se ven y se comportan tus modelos en el panel de administración. Algunas otras cosas que puedes controlar incluyen:
ordering: Para definir el orden por defecto de los elementos en la lista.date_hierarchy: Para agregar una navegación jerárquica por fechas.fields y fieldsets: Para personalizar cómo se muestran los campos en el formulario de edición de un objeto.En el video de este capítulo, exploramos en vivo cómo añadir y usar list_filter y search_fields.
Podemos hacer que nuestro panel de administración de Django sea aún más útil y fácil de usar personalizando la clase ModelAdmin asociada a nuestros modelos (ej: ProveedorAdmin en admin.py). Con list_filter = ('campo1', 'campo2') podemos agregar filtros laterales para encontrar registros más fácilmente. Con search_fields = ('campo1', 'campo2') añadimos una barra de búsqueda que nos permite buscar texto dentro de los campos especificados. ¡Estas pequeñas adiciones marcan una gran diferencia cuando trabajas con muchos datos!
Con estas herramientas, nuestro panel de administración para Proveedores ya es bastante funcional. Pero, ¿qué tal si queremos que se vea un poco más moderno y atractivo? ¡Eso es lo que veremos en el próximo capítulo!