El historial de administración es solo una aplicación como cualquier otra aplicación de Django, con la excepción de una ubicación especial en el sitio de administración.
El modelo está en django.contrib.admin.models.LogEntry.
Cuando un usuario realiza un cambio, agréguelo al registro de esta manera (robado descaradamente de contrib / admin / options.py:
from django.contrib.admin.models import LogEntry, ADDITION
LogEntry.objects.log_action(
user_id = request.user.pk,
content_type_id = ContentType.objects.get_for_model(object).pk,
object_id = object.pk,
object_repr = force_unicode(object),
action_flag = ADDITION
)
dónde object
está el objeto que se cambió, por supuesto.
Ahora veo la respuesta de Daniel y estoy de acuerdo con él, es bastante limitada.
En mi opinión, un enfoque más sólido es utilizar el código de Marty Alchin en su libro Pro Django (consulte Cómo mantener registros históricos a partir de la página 263). Existe una aplicación django-simple-history que implementa y extiende este enfoque ( docs aquí ).
from django.utils.encoding import force_unicode
para 'force_unicode'El registro del historial de cambios del administrador está definido en
django.contrib.admin.models
, y hay unhistory_view
método en laModelAdmin
clase estándar .Sin embargo, no son particularmente inteligentes y están bastante unidos al administrador, por lo que es mejor que los use como ideas y cree su propia versión para su aplicación.
fuente
Sé que esta pregunta es antigua, pero a partir de hoy (Django 1.9), los elementos del historial de Django son más sólidos de lo que eran en la fecha de esta pregunta. En un proyecto actual, necesitaba obtener los elementos del historial reciente y colocarlos en un menú desplegable de la barra de navegación. Así es como lo hice y fue muy sencillo:
Como se ve en el fragmento de código anterior, estoy creando un conjunto de consultas básico desde el modelo LogEntry (django.contrib.admin.models.py es donde se encuentra en django 1.9) y excluyendo los elementos donde no hay cambios involucrados, ordenándolos por el tiempo de acción y solo muestra los últimos 20 registros. También obtengo otro artículo con solo el recuento. Si observa el modelo LogEntry, puede ver los nombres de campo que Django ha utilizado para extraer los datos que necesita. Para mi caso específico, esto es lo que usé en mi plantilla:
Enlace a la imagen del producto final
fuente
Para agregar a lo que ya se ha dicho, aquí hay algunos otros recursos para usted:
(1) He estado trabajando con una aplicación llamada django-reversion que se 'engancha' al historial de administración y en realidad lo agrega. Si quisiera algún código de muestra, sería un buen lugar para buscar.
(2) Si decidió lanzar su propia funcionalidad de historial, django proporciona señales a las que puede suscribirse para que su aplicación maneje, por ejemplo, post_save para cada objeto de historial. Su código se ejecutará cada vez que se guarde una entrada de registro del historial. Doc: señales de Django
fuente
Código de ejemplo
Hola,
Hace poco pirateé algunos registros a una vista de "actualización" para la base de datos de inventario de nuestro servidor. Pensé que compartiría mi código de "ejemplo". La función que sigue toma uno de nuestros objetos "Servidor", una lista de cosas que han sido cambiadas y un action_flag de ADDITION o CHANGE. Simplifica un poco las cosas donde ADICIÓN significa "agregado un nuevo servidor". Un enfoque más flexible permitiría agregar un atributo a un servidor. Por supuesto, fue lo suficientemente desafiante auditar nuestras funciones existentes para determinar si realmente se habían producido cambios, por lo que estoy lo suficientemente feliz de registrar nuevos atributos como un "cambio".
fuente