Le tableau django_admin_log code> 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 code> via Django's Admin's Admin pour tous les utilisateurs? P>
4 Réponses :
Vous ne pouvez pas simplement:
from django.contrib.admin.models import LogEntry admin.site.register(LogEntry)
salut, j'ai fait la même chose mais j'aurais KeyError at / admin / journal de journal code>, et je ne sais pas comment résoudre
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
Vous pouvez faire lire les champs uniquement: readonly_fields = ['utilisateur', 'content_type', 'objet_id', 'objet_repr', 'action_flag', 'changements_message'] code> - tu pourras toujours Cliquez sur Enregistrer, mais ne pas apporter des modifications.
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')
Génial d'avoir la liste de liste personnalisée :)
quelques points de mon expérience:
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