La aplicación que lleva instalada desde la lección 4, las tres banderas que deciden quién entra, y para qué no hay que usarla.
⏱ 14 min de lectura
Desde la lección 4 hay una ruta admin/ en el fichero de rutas y seis aplicaciones en INSTALLED_APPS que nadie ha tocado. Tres de ellas son esto: un panel completo para consultar y editar los datos, generado a partir de los modelos, con su sistema de usuarios y permisos.
Es la pieza que más fama le ha dado a Django, y la que más se malinterpreta. Hay proyectos que la usan de interfaz principal, y eso acaba mal por razones que conviene entender antes de empezar.
Las cuatro hacen falta y cada una tiene su papel. admin es el panel; auth son los usuarios, los grupos y los permisos; sessions es lo que mantiene la sesión iniciada entre peticiones; y contenttypes es un registro de todos los modelos del proyecto, que es lo que permite que los permisos se refieran a cualquier modelo sin conocerlo de antemano.
Salida en pantalla
sin sesión, /admin/ -> 302 /admin/login/?next=/admin/
Fíjate en ese ?next=: el panel recuerda adónde ibas para llevarte allí después de identificarte. Es un detalle que habrá que replicar a mano en la lección 32.
Y está en español, con LANGUAGE_CODE puesto y sin instalar nada.
Un modelo no sale en el panel hasta que se registra, y eso se hace en un fichero que startapp ya creó:
contactos/admin.py
from django.contrib import admin
from.models import Contacto, Etiqueta, Grupo
admin.site.register(Grupo)
admin.site.register(Etiqueta)@admin.register(Contacto)classContactoAdmin(admin.ModelAdmin):pass
Las dos formas son equivalentes. La primera vale cuando no hay nada que configurar; la segunda es la que se acaba usando siempre, porque en cuanto quieras cambiar algo necesitas la clase, y eso es la lección siguiente.
Ahora se entiende una cosa de la lección 15: el __str__ del modelo es lo que se ve en el panel. Un modelo sin __str__ llena las listas de Contacto object (3), y ese es el sitio donde más molesta.
Entra, y el panel está vacío. is_staff abre la puerta y no da acceso a nada, porque lo que se ve depende de los permisos. Y pedir la dirección a mano tampoco funciona: 403.
Esa separación es buena. Permite tener a alguien con acceso al panel y a un solo modelo.
Dar permisos usuario por usuario no escala. Un grupo es un paquete de permisos:
python
grupo = Group.objects.create(name='Editores')
grupo.permissions.add(*Permission.objects.filter(
codename__in=['add_contacto','change_contacto','view_contacto']))
usuario.groups.add(grupo)
Salida en pantalla
tras el grupo, add: True
tras el grupo, delete: False
Los permisos de una persona son los suyos más los de sus grupos. Y todo esto se hace desde el propio panel, en la sección de autenticación, sin escribir código.
La costumbre sana es la misma que en cualquier sistema: los permisos se dan a grupos y las personas se meten en grupos. Dárselos directamente a alguien funciona y a los seis meses nadie sabe por qué esa persona puede hacer eso.
Cada cambio hecho desde el panel queda registrado:
Salida en pantalla
admin | Modificar | Trabajo editado | [{"changed": {"fields": ["Nombre"]}}]
Quién, qué, cuándo y qué campos. Se ve en el botón de historial de cada ficha y vive en un modelo, LogEntry, que se puede consultar.
Tiene un límite importante: solo registra lo que pasa por el panel. Un cambio hecho desde una vista, desde el intérprete o desde una orden de gestión no aparece. No es una auditoría, es el historial del panel.