您在Django Admin中执行的所有更改都记录在表django_admin_table中,您还可以在"Recent Actions"中查看最近的更改.
但是,当您编写自己的"管理操作"并通过它们进行更改时,默认情况下不会记录任何内容.
例:
def make_checked(modeladmin, request, queryset):
queryset.update(checked = 1)
make_checked.short_description = 'Mark selected products as checked'
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,是否可以记录自定义管理员操作,如果可以,如何记录?
Tim*_*ony 18
看看管理员的LogEntry模型,更重要的是LogEntryManager.模型管理器提供了一种log_action方法,可以轻松添加您自己的日志条目(这是未经测试但应该给您的想法):
from django.contrib.admin.models import LogEntry, CHANGE
from django.contrib.contenttypes.models import ContentType
def make_checked(modeladmin, request, queryset):
queryset.update(checked = 1)
ct = ContentType.objects.get_for_model(queryset.model)
for obj in queryset:
LogEntry.objects.log_action(
user_id=request.user.id,
content_type_id=ct.pk,
object_id=obj.pk,
object_repr=obj.description,
action_flag=CHANGE,
change_message="You have ...")
make_checked.short_description = 'Mark selected products as checked'
Run Code Online (Sandbox Code Playgroud)
您可以看到正常django管理员中使用的一些日志记录示例.如果您只想LogEntry为整个查询集添加单个,则可以手动执行(因为log_entry上面需要一组专门用于记录单个对象的参数):
l = LogEntry(user_id=request.user.id, actions_flag=CHANGE, change_message="...")
l.save()
Run Code Online (Sandbox Code Playgroud)
实际上,现在有一种比接受的答案更简单的方法,前提是您有一个ModelAdmin可用的方法,您可以在自定义操作的情况下执行此操作。
该ModelAdmin班是不是有据可查的,但它实际上提供了这些方法的快捷方式:
def log_addition(self, request, object, message):
"""
Log that an object has been successfully added.
The default implementation creates an admin LogEntry object.
"""
def log_change(self, request, object, message):
"""
Log that an object has been successfully changed.
The default implementation creates an admin LogEntry object.
"""
def log_deletion(self, request, object, object_repr):
"""
Log that an object will be deleted. Note that this method must be
called before the deletion.
The default implementation creates an admin LogEntry object.
"""
Run Code Online (Sandbox Code Playgroud)
这些很容易使用。继续问题中的示例:
def make_checked(modeladmin, request, queryset):
queryset.update(checked = 1)
for obj in queryset:
modeladmin.log_change(request, obj, 'Marked checked: ' + str(obj))
make_checked.short_description = 'Mark selected products as checked'
Run Code Online (Sandbox Code Playgroud)