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:
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.
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á.
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
Como cambiar como aparecen o se reflejan los nombres de los campos en las tablas en el panel de administración.
¿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):
...
Como ver los nombre de los campos, en vez de un objeto en el panel de administración.
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.
Añadir una casilla de búsqueda de registros.
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)
...
¿Cómo filtrar los registros que tengamos en las tablas?
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)
...
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?
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)
...
¿Cómo cambiar el idioma del panel de administración?
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
...