Django记录操作日志与LogEntry的使用详解

林见深
林见深
发布时间:2026-10-15 | 3人浏览过
原创

本文详解Django中LogEntry模块的使用方法。LogEntry在Admin中默认开启,通过log_addition和log_change记录新增与变更。文章介绍了如何查询特定对象的变更日志,并在Admin后台配置以方便查看操作记录,适用于监督用户行为及数据回滚场景。

前言

LogEntry是后台开发中常用的模块,它在Admin后台默认处于开启状态。

利用LogEntry模块可以记录所有用户的操作行为。这既可用于监督用户活动,也可用于数据回滚。

1. 使用LogEntry

ModelAdmin本身具备日志记录功能。当新建实体(如Post、Category、Tag)时,ModelAdmin会自动创建一条变更日志记录;当修改内容时,ModelAdmin会调用LogEntry生成一条日志,记录该变更。

ModelAdmin内部提供了两个核心方法:log_addition和log_change。

log_addition用于记录新增操作的日志。

log_change用于记录变更操作的日志。

我们可以通过查看这两个方法的定义来深入理解LogEntry模块。

代码位置:django/admin/contrib/options.py

def log_addition(self, request, object, message):
        """
        Log that an object has been successfully added.

        The default implementation creates an admin LogEntry object.
        """
        from django.contrib.admin.models import LogEntry, ADDITION
        return LogEntry.objects.log_action(
            user_id=request.user.pk,
            content_type_id=get_content_type_for_model(object).pk,
            object_id=object.pk,
            object_repr=str(object),
            action_flag=ADDITION,
            change_message=message,
        )

    def log_change(self, request, object, message):
        """
        Log that an object has been successfully changed.

        The default implementation creates an admin LogEntry object.
        """
        from django.contrib.admin.models import LogEntry, CHANGE
        return LogEntry.objects.log_action(
            user_id=request.user.pk,
            content_type_id=get_content_type_for_model(object).pk,
            object_id=object.pk,
            object_repr=str(object),
            action_flag=CHANGE,
            change_message=message,
        )

从上述代码可以看出,这两个方法均调用了LogEntry.objects.log_action方法,仅参数略有差异。若需自定义变更记录,只需传递相应参数即可。以下简要介绍这些参数。

user_id

当前操作的用户ID。

content_type_id

要保存内容的类型ID。上述代码中使用get_content_type_for_model方法获取对应Model的类型ID。这可以简单理解为ContentType为每个Model定义了一个类型ID。

object_id

记录变更实例的ID,例如在PostAdmin中即为post.id。

object_repr

实例的展示名称,可简单理解为我们定义的__str__方法所返回的内容。

action_flag

操作标记。Admin的Model中定义了三种基础标记:ADDITION(新增)、CHANGE(变更)和DELETION(删除)。它用于标记当前参数是数据变更、新增还是删除。

change_message

记录的消息内容,可自定义。我们可以将新添加的内容放入其中(必要时可通过这里恢复),也可以将新旧内容的区别放入其中。

理解了这些参数后,遇到类似需求时,即可直接使用Django现成的工具完成操作。

2. 查询某个对象的变更

前面我们了解了如何记录某个对象的变更日志,那么问题来了:如何查询已记录的变更呢?

这其实是一个简单的Model查询问题。假设我们记录的对象是Post的操作,现在要获取Post中id为1的所有变更日志,大致代码如下:

from django.contrib.admin.models import LogEntry, CHANGE
from django.contrib.admin.options import get_content_type_for_model

post = Post.objects.get(id=1)
log_entries = LogEntry.objects.filter(
    content_type_id=get_content_type_for_model(post).pk,
    object_id=post.id,

这样我们就拿到了文章id为1的所有变更记录。

3. 在admin页面上查看操作日志

既然知道如何记录变更日志,也知道如何获取变更日志,那么如何在Admin后台方便地查看操作日志呢?

新增如下配置:

#最上面增加import
from django.contrib.admin.models import LogEntry
#文件最下方增加
@adnin.register(LogEntry, site=custom_site)
class LogEntryAdmin(admin.ModelAdmin):
    list_display = ['object_repr','object_ id','action_flag','user','change_message']

如果你配置过xadmin,则在adminx.py进行配置:

#最上面增加import
from django.contrib.admin.models import LogEntry
#文件最下方增加
xadmin.site.register(LogEntry,LogEntryAdmin)
class LogEntryAdmin(object):
    list_display = ['object_repr','object_id','action_flag','user','change_message']

这样就可以看到所有的变更记录了。如下图所示:

总结

到此这篇关于Django记录操作日志与LogEntry使用的文章就介绍到这了,更多相关Django记录操作日志内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表