django记录操作日志

1.LogEntry模块
django的日志记录是通过LogEntry模块实现的。日志记录的功能ModelAdmin本身就有。当我们新建一个实体(Post,Category, Tag等)时,它就会帮我们创建一条变更日志记录。当我们新建一条内容时,ModelAdmin又会帮我们调用LogEntry来创建一条日志,记录一下这个变更。
ModelAdmin内容提供了两个方法,分别是log_addition和log_change。在官方文档是看不见这个介绍的,因为它是内部使用的函数(可通过源码查看,位置是:site-packages\django\contrib\admin\views\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=force_text(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=force_text(object),
            action_flag=CHANGE,
            change_message=message,
        )
   
       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.
        """
        from django.contrib.admin.models import LogEntry, DELETION
        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=object_repr,
            action_flag=DELETION,
        )

这三个方法均调用了LogEntry.objects.log_action方法,只是参数略有不同。可以看到,如果需要自定义变更记录的话,只需要传递对应的参数即可。这里简要介绍一下这些参数。
user_id:当前用户id
content_type_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:这是记录的消息,可以自定义。我们可以把新添加的内容放进去(必要时可以通过这里来恢复),也可以把新旧内容的区别放进去。
  1. 查询某个对象的变更
    假设我们记录的对象是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.objcts.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页面上查看操作日志
配置如下:

from django.contrib.admin.models import LogEntry

@admin.register(LogEntry, site=custom_site)
class LogEntryAdmin(admin.ModelAdmin):
	list_display=['object_repr', 'object_id', 'action_flag', 'user', 'change_message']

这个管理的权限应该只有超级用户才有,因为这里可以看到所有用户的操作记录。当然,如果需要配置其他用户可见,但是又不想设置他为管理员的话,可以通过我们拆出来的super_admin后台对某个用户进行权限配置。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值