6
votes

Django_admin_log peut-il être surveillé via l'administrateur de Django?

Le tableau django_admin_log est utile pour surveiller les actions des utilisateurs dans l'administrateur. En ce moment, je peux y parvenir directement en interrogeant la base de données. Y a-t-il une fonctionnalité intégrée où je peux afficher la table django_admin_log via Django's Admin's Admin pour tous les utilisateurs?


0 commentaires

4 Réponses :


13
votes

Vous ne pouvez pas simplement:

from django.contrib.admin.models import LogEntry
admin.site.register(LogEntry)


1 commentaires

salut, j'ai fait la même chose mais j'aurais KeyError at / admin / journal de journal , et je ne sais pas comment résoudre



8
votes

Voici ma version. Référence pour les champs disponibles.

class LogAdmin(admin.ModelAdmin):
    """Create an admin view of the history/log table"""
    list_display = ('action_time','user','content_type','change_message','is_addition','is_change','is_deletion')
    list_filter = ['action_time','user','content_type']
    ordering = ('-action_time',)
    #We don't want people changing this historical record:
    def has_add_permission(self, request):
        return False
    def has_change_permission(self, request, obj=None):
        #returning false causes table to not show up in admin page :-(
        #I guess we have to allow changing for now
        return True
    def has_delete_permission(self, request, obj=None):
        return False


1 commentaires

Vous pouvez faire lire les champs uniquement: readonly_fields = ['utilisateur', 'content_type', 'objet_id', 'objet_repr', 'action_flag', 'changements_message'] - tu pourras toujours Cliquez sur Enregistrer, mais ne pas apporter des modifications.



6
votes

Voici une configuration d'administration plus étendue pour la visualisation de toutes les entrées de journal qui s'appuie sur Django 2.1 Autorisations uniquement sur la vue:

from django.contrib import admin
from django.contrib.admin.models import LogEntry, DELETION
from django.utils.html import escape
from django.utils.safestring import mark_safe
from django.urls import reverse

@admin.register(LogEntry)
class LogEntryAdmin(admin.ModelAdmin):
    date_hierarchy = 'action_time'
    readonly_fields = ('action_time',)
    list_filter = ['user', 'content_type']
    search_fields = ['object_repr', 'change_message']
    list_display = ['__str__', 'content_type', 'action_time', 'user', 'object_link']

    # keep only view permission
    def has_add_permission(self, request):
        return False

    def has_change_permission(self, request, obj=None):
        return False

    def has_delete_permission(self, request, obj=None):
        return False

    def object_link(self, obj):
        if obj.action_flag == DELETION:
            link = obj.object_repr
        else:
            ct = obj.content_type
            try:
                link = mark_safe('<a href="%s">%s</a>' % (
                                 reverse('admin:%s_%s_change' % (ct.app_label, ct.model),
                                         args=[obj.object_id]),
                                 escape(obj.object_repr),
                ))
            except NoReverseMatch:
                link = obj.object_repr
        return link
    object_link.admin_order_field = 'object_repr'
    object_link.short_description = 'object'

    def queryset(self, request):
        return super(LogEntryAdmin, self).queryset(request) \
            .prefetch_related('content_type')


1 commentaires

Génial d'avoir la liste de liste personnalisée :)



1
votes

quelques points de mon expérience:

  • Il est bon de faire lire tous les champs. Une des raisons est évidemment parce que ce sont des bûches et ne devraient pas être mutables, mais une autre est la performance. Si vous autorisez la modification des utilisateurs, par exemple, le chargement de la page de changement est propre peut être question si vous avez des centaines de milliers d'utilisateurs comme dans mon cas. Sinon, vous pouvez utiliser raw_id_fields code>. Li>
  • Les valeurs de filtre de type de contenu sont non traduites par le modèle, il est donc hostile, mais je n'ai pas de bonne solution générique à partager. Li>
  • J'ai aussi créé le filtre d'action, car le modèle Orignal n'a pas CHOIX code> et en utilisant Just action_flag code> comme filtre montrera 1,2,3 comme choix, qui n'est pas très convivial: p>

    class ActionFlagFilter(admin.SimpleListFilter):
        title = 'Action flag filter'
    
        parameter_name = 'action_flag'
    
        def lookups(self, request, model_admin):
            return (
                (ADDITION, "Add"),
                (CHANGE, "Change"),
                (DELETION, "Delete"),
            )
    
        def queryset(self, request, queryset):
            if self.value():
                return queryset.filter(action_flag=self.value())
            return queryset
    


0 commentaires