César, parte de nuestro staff, nos ha hecho el favor de crear este post ya que conoce a la perfección dicho tema.
Solución:
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.utils.encoding import force_unicode
from django.contrib.contenttypes.models import ContentType
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
)
donde object
es el objeto que fue cambiado 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 fuerte es usar el código de Marty Alchin en su libro Pro Django (ver Mantenimiento de registros históricos a partir de la página 263). Hay una aplicación django-simple-history que implementa y amplía este enfoque (documentos aquí).
El registro del historial de cambios del administrador se define en django.contrib.admin.models
y hay un history_view
método en el estándar ModelAdmin
clase.
Sin embargo, no son particularmente inteligentes y están estrechamente relacionados con el administrador, por lo que es mejor que los uses para obtener ideas y crear tu propia versión para tu aplicación.
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 desde la barra de navegación. Así es como lo hice y fue muy sencillo:
*views.py*
from django.contrib.admin.models import LogEntry, ADDITION, CHANGE, DELETION
def main(request, template):
logs = LogEntry.objects.exclude(change_message="No fields changed.").order_by('-action_time')[:20]
logCount = LogEntry.objects.exclude(change_message="No fields changed.").order_by('-action_time')[:20].count()
return render(request, template, "logs":logs, "logCount":logCount)
Como se ve en el fragmento de código anterior, estoy creando un conjunto de consultas básico a partir del modelo LogEntry (django.contrib.admin.models.py es donde se encuentra en django 1.9) y excluyo los elementos en los que no hay cambios involucrados, ordenándolos por el tiempo de acción y solo muestra los últimos 20 registros. También estoy recibiendo otro artículo con solo el conteo. Si observa el modelo LogEntry, puede ver los nombres de campo que Django ha utilizado para recuperar los datos que necesita. Para mi caso específico, esto es lo que usé en mi plantilla:
Enlace a la imagen del producto final
*template.html*
Si para ti ha resultado de provecho este post, sería de mucha ayuda si lo compartieras con otros desarrolladores y nos ayudes a extender nuestro contenido.