Der Admin-Verlauf ist nur eine App wie jede andere Django-App, mit Ausnahme der speziellen Platzierung auf der Admin-Site.
Das Modell befindet sich in django.contrib.admin.models.LogEntry.
Wenn ein Benutzer eine Änderung vornimmt, fügen Sie diese dem Protokoll wie folgt hinzu (schamlos gestohlen von 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
)
Wo object
ist das Objekt, das natürlich geändert wurde?
Jetzt sehe ich Daniels Antwort und stimme ihm zu, sie ist ziemlich begrenzt.
Meiner Meinung nach besteht ein stärkerer Ansatz darin, den Code von Marty Alchin in seinem Buch Pro Django zu verwenden (siehe Aufbewahren historischer Aufzeichnungen ab Seite 263). Es gibt eine Anwendung django-simple-history, die diesen Ansatz implementiert und erweitert ( Dokumente hier ).
from django.utils.encoding import force_unicode
für 'force_unicode'Das Änderungsprotokoll des Administrators ist in definiert
django.contrib.admin.models
, undhistory_view
die Standardklasse enthält eine MethodeModelAdmin
.Sie sind jedoch nicht besonders clever und ziemlich eng mit dem Administrator verbunden. Verwenden Sie diese also am besten nur für Ideen und erstellen Sie Ihre eigene Version für Ihre App.
quelle
Ich weiß, dass diese Frage alt ist, aber bis heute (Django 1.9) sind Djangos Geschichtsgegenstände robuster als zum Zeitpunkt dieser Frage. In einem aktuellen Projekt musste ich die aktuellen Verlaufselemente abrufen und in ein Dropdown-Menü in der Navigationsleiste einfügen. So habe ich es gemacht und war sehr direkt:
Wie im obigen Code-Snippet zu sehen ist, erstelle ich ein grundlegendes Abfrageset aus dem LogEntry-Modell (django.contrib.admin.models.py befindet sich in django 1.9) und schließe die Elemente aus, bei denen keine Änderungen erforderlich sind, und ordne es nach die Aktionszeit und zeigt nur die letzten 20 Protokolle an. Ich bekomme auch einen anderen Artikel mit nur der Zählung. Wenn Sie sich das LogEntry-Modell ansehen, sehen Sie die Feldnamen, die Django verwendet hat, um die benötigten Daten zurückzuziehen. Für meinen speziellen Fall habe ich Folgendes in meiner Vorlage verwendet:
Link zum Bild des Endprodukts
quelle
Um das bereits Gesagte zu ergänzen, sind hier einige andere Ressourcen für Sie:
(1) Ich habe mit einer App namens Django-Reversion gearbeitet, die sich in den Admin-Verlauf einfügt und diesen tatsächlich ergänzt. Wenn Sie einen Beispielcode wünschen, ist dies ein guter Ort, um nachzuschauen.
(2) Wenn Sie sich entschieden haben, Ihre eigene Verlaufsfunktionalität zu erweitern, liefert django Signale, die Sie abonnieren können, damit Ihre App beispielsweise post_save für jedes Verlaufsobjekt verarbeitet. Ihr Code wird jedes Mal ausgeführt, wenn ein Verlaufsprotokolleintrag gespeichert wird. Doc: Django-Signale
quelle
Beispielcode
Hallo,
Ich habe kürzlich einige Protokolle in eine "Update" -Ansicht für unsere Server-Inventardatenbank gehackt. Ich dachte, ich würde meinen "Beispiel" -Code teilen. Die folgende Funktion verwendet eines unserer "Server" -Objekte, eine Liste der geänderten Dinge und ein action_flag von ADDITION oder CHANGE. Es vereinfacht die Dinge ein wenig, wobei ADDITION "einen neuen Server hinzugefügt" bedeutet. Ein flexiblerer Ansatz würde das Hinzufügen eines Attributs zu einem Server ermöglichen. Natürlich war es ausreichend schwierig, unsere vorhandenen Funktionen zu überprüfen, um festzustellen, ob tatsächlich Änderungen stattgefunden haben. Daher bin ich froh, neue Attribute als "Änderung" zu protokollieren.
quelle