115 votes

Le lien pour Django Admin Modèle de l'Histoire

Le Programme D'Installation:

  • Je suis en train de travailler sur une application Django qui permet aux utilisateurs de créer un objet dans la base de données, puis revenir en arrière et modifier autant de fois qu'ils le désirent.
  • De Django reinhardt, le site d'administration conserve l'historique des modifications apportées aux objets par l'intermédiaire de l'administrateur du site.

La Question:

  • Comment puis-je brancher ma demande à l'admin du site, changer l'histoire, de sorte que je peux voir l'historique des modifications, les utilisateurs font de leur "contenu" ?

159voto

Van Gale Points 21982

L'administrateur de l'histoire est juste une application comme n'importe quel autre Django application, à l'exception d'une disposition particulière sur l'admin du site.

Le modèle est dans django.contrib.admin.modèles.LogEntry.

Lorsqu'un utilisateur effectue un changement, ajouter dans le journal comme ceci (volé sans vergogne 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
)

object est l'objet qui a changé de cours.

Maintenant, je vois la réponse de Daniel et d'accord avec lui, il est assez limité.

À mon avis, une approche plus efficace est d'utiliser le code de Marty Alchin dans son livre Pro Django (voir Gardant Historique des Enregistrements à partir de la page 263).

27voto

Daniel Roseman Points 199743

L'admin de changer l'histoire du journal est défini en django.contrib.admin.models, et il y a un history_view méthode de la norme ModelAdmin classe.

Ils ne sont pas particulièrement intelligent, cependant, et assez étroitement couplée à l'admin, donc vous pouvez être le meilleur à l'aide de ces idées et de la création de votre propre version de votre application.

7voto

T. Stone Points 10782

Pour ajouter à ce qui a déjà été dit, voici quelques ressources pour vous:

(1) j'ai travaillé avec un soft appelé django-réversion qui "crochets" l'administrateur de l'histoire et ajoute réellement à elle. Si vous vouliez un exemple de code qui serait un bon endroit pour chercher.

(2) Si vous avez décidé de rouler votre propre histoire de la fonctionnalité de django fournit des signaux que vous pouvez vous abonner à votre application de la poignée, par exemple, post_save pour chaque histoire de l'objet. Votre code s'exécute à chaque fois qu'un journal de l'historique de l'inscription a été enregistrée. Doc: Django signaux

3voto

dannyman Points 64

Exemple De Code

Bonjour,

J'ai récemment piraté dans certains enregistrement à une "mise à jour" vue pour notre serveur de base de données d'inventaire. J'ai pensé que je voudrais partager mes "exemple de code". La fonction qui suit prend un de nos "Serveur" des objets, une liste de choses qui ont été modifiés, et un action_flag soit de l'AJOUT ou de la MODIFICATION. Il simplifie les choses un petit peu où PLUS de moyens ", a ajouté un nouveau serveur." Une approche plus souple permettrait l'ajout d'un attribut à un serveur. Bien sûr, il est assez difficile pour la vérification de nos fonctions existantes afin de déterminer si des changements ont eu lieu, donc je suis assez heureux pour vous connecter de nouveaux attributs comme un "changement".

from django.contrib.admin.models import LogEntry, User, ADDITION, CHANGE
from django.contrib.contenttypes.models import ContentType

def update_server_admin_log(server, updated_list, action_flag):
    """Log changes to Admin log."""
    if updated_list or action_flag == ADDITION:
        if action_flag == ADDITION:
            change_message = "Added server %s with hostname %s." % (server.serial, server.name)
        # http://dannyman.toldme.com/2010/06/30/python-list-comma-comma-and/
        elif len(updated_list) > 1:
            change_message = "Changed " + ", ".join(map(str, updated_list[:-1])) + " and " + updated_list[-1] + "."
        else:
            change_message = "Changed " + updated_list[0] + "."
        # http://stackoverflow.com/questions/987669/tying-in-to-django-admins-model-history
        try:
            LogEntry.objects.log_action(
                # The "update" user added just for this purpose -- you probably want request.user.id
                user_id = User.objects.get(username='update').id,
                content_type_id = ContentType.objects.get_for_model(server).id,
                object_id = server.id,
                # HW serial number of our local "Server" object -- definitely change when adapting ;)
                object_repr = server.serial,
                change_message = change_message,
                action_flag = action_flag,
                )
        except:
            print "Failed to log action."

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X