lunes, 23 de enero de 2023

8.- Django - Panel de Administración.

Normalmente la gestión de una página web se hace desde un panel de control. Se puede añadir nuevos usuarios, añadir registros a las tablas que hemos creado etc.  Al crear el proyecto con el comando "startproject" por defecto el panel de administración ya aparece habilitado. Fijaros que en el proyecto ya hay un archivo llamado "admin.py" que sirve para esto y también que en settings.py por defecto donde tenemos INSTALLED_APPS ya aparece la librería django.contrib.admin y otras para manejar esto.

Si ejecutamos el servidor con:

$ python manage.py runserver

y vamos a la dirección:

/localhost:8000/admin ya vemos como nos aparece el panel de administración:


Panel de Administración de Django



Para acceder necesitas un usuario y una contraseña. Esto se consigue creando un SUPERUSUARIO que maneje esto:


$ python manage.py createsuperuser


Nos preguntará por un nombre de usuario, correo electrónico y contraseña. Una vez creado ya nos podremos loguear y veremos la siguiente pantalla.


pantalla inicio administrador de Django

De momento está muy vacío pero ya nos permite crear grupos y usuarios para la administración.

Vamos a ver como incluir las tablas de la base de datos en el panel de administración. De esta forma podremos crear registros sin tener que abrir el shell de python. Lo haremos directamente de forma gráfica.

Edita el archivo admin.py de la aplicación gestionPedidos. Si lo abrimos veremos lo siguiente:

from django.contrib import admin

# Register your models here.

A modo de comentario nos dice que registremos aquí nuestros modelos. En el ejemplo Clientes, Artículos y Pedidos. Así que vamos a importarlos y luego añadir el código para que se muestren en el panel de administración:

from django.contrib import admin

# Register your models here.

# Importamos los modelos
from .models import Clientes, Articulos, Pedidos

# Los registramos en el pandel de administración.
admin.site.register(Clientes)
admin.site.register(Articulos)
admin.site.register(Pedidos)

Para ver si hemos tenido éxito ejecutamos el servidor y vamos a la url del panel de administración y ya nos aparecen las tablas. Como curiosidad DJANGO añade una "s" al final de todas las tablas con lo que si el nombre de la tabla ya terminaba en "s" esta se repetirá.

Panel de administración con las tablas

Si pinchamos en cualquiera de las tablas ya podemos hacer cualquier cosa con los registros (crear, actualizar, borrar etc). Por ahora todos los campos de la tabla aparecen en negrita lo que quiere decir que al añadir uno nuevo es obligatorio rellenarlos. Esto más tarde veremos como modificarlo para poder añadir campos opcionales.

Por defecto cada registro de la base de datos aparece como un objeto. No lo hace así la tabla Artículos que ya teníamos creada, porque habíamos definido en models.py el método __str__(). Así que si queremos ver la información de esta manera hay que añadir este método como vimos en el capitulo anterior.

Para poder establecer un campo como opcional hay que modificar el modelo (models.py) añadiendo esto al campo que queramos que sea opcional (blank=True, null=True). Por ejemplo para poner como opcional el campo correo electrónico de la tabla clientes, haríamos lo siguiente:

gestionPedidos/models.py

...
# Las tablas se crean mediante clases.

class Clientes(models.Model):
    # Dentro de la clase se crean los diferentes campos.
    nombre = models.CharField(max_length=30)
    direccion = models.CharField(max_length=50)
    # Email ya valido ya esta creado
    email = models.EmailField(blank=True, null=True)
    telefono = models.CharField(max_length=9)

class Articulos(models.Model):
...

Como siempre que se hacen modificaciones al modelo hay que realizar las correspondientes migraciones.

(miEntorno) chema@lenovo:~/Cursos/DJANGO/tiendaVirtual$ python manage.py makemigrations
Migrations for 'gestionPedidos':
  gestionPedidos/migrations/0002_alter_clientes_email.py
    - Alter field email on clientes
(miEntorno) chema@lenovo:~/Cursos/DJANGO/tiendaVirtual$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, gestionPedidos, sessions
Running migrations:
  Applying gestionPedidos.0002_alter_clientes_email... OK
y ya el campo no aparece en negrita, así que no es un campo obligatorio:

Campo opcional en una tabla



Como cambiar como aparecen o se reflejan los nombres de los campos en las tablas en el panel de administración.

Por defecto Django traslada tal cual los nombres de los campos de las tablas. Con una particularidad que los pone la primera letra del nombre del campo en Mayúsculas. También si el nombre del campo fuera compuesto (Ej nombre_cliente) quitaría el guión bajo y pondría el nombre de la primera palabra en mayúsculas.

¿Pero que ocurre si queremos ver a través del panel de administración un nombre diferente? Imaginemos que en vez de que en la tabla de clientes el campo "dirección" queremos que aparezca como "el domicilio".

Para que esto ocurra hay que ir al modelo, localizar donde se encuentra dicho campo y en el método .CharField agregar un segundo argumento, verbosename con el nombre que queremos que aparezca en el panel de administración. Para ver los cambios no es necesario reiniciar el servidor.

gestionPedidos/models.py

...
# Las tablas se crean mediante clases.

class Clientes(models.Model):
    # Dentro de la clase se crean los diferentes campos.
    nombre = models.CharField(max_length=30)
    direccion = models.CharField(max_length=50, verbosename="el domicilio")
    # Email ya valido ya esta creado
    email = models.EmailField(blank=True, null=True)
    telefono = models.CharField(max_length=9)

class Articulos(models.Model):
...
cambio nombre de campo en panel de administración.


Como ver los nombre de los campos, en vez de un objeto en el panel de administración.

Por defecto cuando entramos en una tabla el panel de administración nos muestra cada registro como un objeto. Anteriormente mejoramos esto para la tabla artículos definiendo un método __str__(self) dentro de la clase que define esta tabla. ¿Pero como hacer para que en vez de un objeto el panel de administración nos muestre los campos que queramos nosotros? Por ejemplo que en la tabla clientes se muestre el nombre, dirección y teléfono.

Para ello debemos ir al archivo admin.py y crear una clase que herede de admin.ModelAdmin lo que nos va a permitir hacer modificaciones en los modelos. Antes de registrar las tablas creamos una clase de la siguiente forma y luego la registramos junto a la tabla.

gestionPedidos/admin.py

from django.contrib import admin

# Register your models here.

# Importamos los modelos
from gestionPedidos.models import Clientes
from gestionPedidos.models import Articulos
from gestionPedidos.models import Pedidos

# Para personalizar que campos se ven en las tablas en el panel de administración
# ya que si no cada registro se ve como un objeto.
class PanelClientes(admin.ModelAdmin):
    list_display("nombre","direccion","telefono")

# Los registramos en el pandel de administración.
admin.site.register(Clientes, PanelCliente)
admin.site.register(Articulos)
admin.site.register(Pedidos)

Ya podemos reiniciar el servidor y ver si ha funcionado.

mostrar nombres de campos en vez del objeto


Añadir una casilla de búsqueda de registros.

Cuando tengamos muchos registros nos puede venir bien tener una casilla que nos permita buscar registros basándonos en algún o algunos campos.

Para ello volvemos al archivo admin.py y debajo de la clase que creamos antes "PanelClientes" y debajo de list_display añadimos la propiedad search_fields con los campos por los que se pueda realizar la búsqueda.

gestionPedidos/admin.py

...

# Para personalizar que campos se ven en las tablas en el panel de administración
# ya que si no cada registro se ve como un objeto.
class PanelClientes(admin.ModelAdmin):
    list_display("nombre","direccion","telefono")
    # para que aparezca un campo de búsqueda y permita buscar por los campos
    # nombre y teléfono
    search_fields=("nombre", "telefono")

# Los registramos en el panel de administración.
admin.site.register(Clientes, PanelCliente)
admin.site.register(Articulos)
admin.site.register(Pedidos)
...
casilla para buscar registros


¿Cómo filtrar los registros que tengamos en las tablas?

Si cogemos la tabla Articulos que tenía unos cuantos artículos (juegos) vamos a ver como podemos filtrar los registros en base por ejemplo al campo "categoría".

Para ello tenemos que ir al archivo "admin.py" de la aplicación gestionPedidos y crear una nueva clase al igual que en su día hicimos para crear una pestaña de buscador. Creamos una nueva clase que herede de admin.ModelAdmin y usamos la instrucción list_filter de la siguiente forma:


gestionPedidos/admin.py

...

# Para personalizar que campos se ven en las tablas en el panel de administración
# ya que si no cada registro se ve como un objeto.
class PanelClientes(admin.ModelAdmin):
    list_display("nombre","direccion","telefono")
    # para que aparezca un campo de búsqueda y permita buscar por los campos
    # nombre y teléfono
    search_fields=("nombre", "telefono")

# Para establecer filtros de una tabla en base a un criterio (campo)
class PanelArticulos(admin.ModelAdmin):
    list_filter=("categoria",)

# Los registramos en el panel de administración.
admin.site.register(Clientes, PanelCliente)
admin.site.register(Articulos, PanelArticulos)
admin.site.register(Pedidos)
...


panel de administración con filtros


Otra forma de registrar las tablas en en el panel de administración es usando decoradores. En el ejemplo anterior se haría de la siguiente forma:

gestionPedidos/admin.py

...

# Para personalizar que campos se ven en las tablas en el panel de administración
# ya que si no cada registro se ve como un objeto.
@admin.register(Clientes)
class PanelClientes(admin.ModelAdmin):
    list_display("nombre","direccion","telefono")
    # para que aparezca un campo de búsqueda y permita buscar por los campos
    # nombre y teléfono
    search_fields=("nombre", "telefono")

# Para establecer filtros de una tabla en base a un criterio (campo)
@admin.register(Articulos)
class PanelArticulos(admin.ModelAdmin):
    list_filter=("categoria",)

# Los registramos en el panel de administración.
admin.site.register(Pedidos)
...

¿Cómo ordenar los registros que tengamos en las tablas en base a unos determinados campos?

Para conseguir esto vamos a usar la propiedad ordering = []. 

En el contexto de Django y la configuración del administrador (admin.py), se utiliza
 para especificar el orden predeterminado en el que se mostrarán los objetos del modelo en la vista de lista del panel de administración. Por ejemplo, vamos a ver como podemos ordenar los clientes para que se muestren por orden alfabético y si existiesen clientes con el mismo nombre que se ordenen por su dirección. Es decir, en este caso, los objetos se ordenarán primero por el campo 'nombre' y luego por el campo 'direccion'.

gestionPedidos/admin.py

...

# Para personalizar que campos se ven en las tablas en el panel de administración
# ya que si no cada registro se ve como un objeto.
class PanelClientes(admin.ModelAdmin):
    list_display("nombre","direccion","telefono")
    # para que aparezca un campo de búsqueda y permita buscar por los campos
    # nombre y teléfono
    search_fields=("nombre", "telefono")
    ordering = ["nombre", "direccion"]

# Para establecer filtros de una tabla en base a un criterio (campo)
class PanelArticulos(admin.ModelAdmin):
    list_filter=("categoria",)

# Los registramos en el panel de administración.
admin.site.register(Clientes, PanelCliente)
admin.site.register(Articulos, PanelArticulos)
admin.site.register(Pedidos)
...

Puedes encontrar mas información sobre el Administrador de Django en el siguiente sitio web https://docs.djangoproject.com/en/4.2/ref/contrib/admin/

¿Cómo cambiar el idioma del panel de administración?


Tenemos que ir al archivo "settings.py" y buscar la clave "LANGUAGE_CODE" comentarla por si queremos volver a ponerla en ingles y poner el idioma que queramos. Yo la pondré en español. También cambiaré la zona horaria a la de España que en verano son dos horas menos.


tiendaVirtual/settings.py

...

# Internationalization
# https://docs.djangoproject.com/en/4.1/topics/i18n/

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'es-eu'

TIME_ZONE = 'Europe/Madrid'

USE_I18N = True

USE_TZ = True
...

Agregar usuarios con diferentes perfiles al panel de administración.


A parte de nuestro usuario que tiene un perfil de  Superusuario, es decir, puede realizar cualquier tipo de acción, podemos crear nuevos usuarios que pueden tener los mismos permisos que nosotros o no. 

Si es parte del staff puede entrar en el panel de administración de Django. Pero esto no implica que pueda modificar todo, puede estar limitado a ciertas acciones.

Puede ser un usuario activo que son aquellos que pueden acceder a urls que necesitan autentificación dentro de nuestro sitio.

Para añadir un nuevo usuario entramos en "Autentificación y autorización" y "añadir usuario".

registrar un nuevo usuario


Aunque tengamos el usuario creado, necesitamos que sea staff si queremos que pueda acceder al panel de administración. Pero si entra sin que le concedamos permisos no vera nada, tendremos por tanto que definir con los permisos, que es lo que puede hacer.


Pero para no tener que ir asignando permisos de forma individual podemos crear un grupo ya con todos ellos y asignarlo a los usuarios que necesitemos, lo cual es más fácil.



No hay comentarios:

Publicar un comentario