Django记录操作日志与LogEntry的使用详解
作者:Edison、23 发布时间:2022-03-15 11:21:46
前言
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
要保存内容的类型,上面的代码中使用的是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']
这样就可以看到所有的变更记录了。如下图所示:
总结
来源:https://www.cnblogs.com/zihao1037/p/11057341.html


猜你喜欢
- 此文章主要介绍的是MySQL数据库的字符(串)的实际操作步骤,我们大家都知道MySQL数据库的字符(串)在实际操作是经常被用到了,所以你对其
- 如下所示,代码为:array也可直接使用上面代码。测试如下:来源:https://blog.csdn.net/u011624019/arti
- //获得视频文件的缩略图function getVideoCover($file,$time,$name) { &nb
- 前言world:世界表格continent:大洲名称name:国家名称population:人口数量聚合函数介绍sum()求和函数avg()
- Python 安装Graphviz 详细教程Python安装Graphviz画图器首先,要明确他是一个独立的软件,如果大家用pip的方法装了
- Bootstrap 通过一些简单的 HTML 标签和扩展的类即可创建出不同样式的表单。0x01 样式1一个登录界面:<!DOCTYPE
- 基本信息程序包名称:基于.net开发的遵循web标准的个人站点程序包下载开发者主页:www.ceocio.net软件大小:1.84mb安装环
- 局部名字静态检测 Python探测局部作用域的时候:是在python编译代码时检测,而不是通过他们在运行时的赋值。 正常的情况下,没在函数中
- 本文记录了mysql 8.0.12 安装配置方法,供大家参考,具体内容如下1、从官网下载MySQL for Windows:https://
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 8 - Input Filtering Part
- 示例:# -*- coding:utf-8 -*-import jsonstrtest = {"中故宫":"好
- 1. 准备工作有朋友可能没用过folium,它其实就是python的一个专业绘制地图的第三方库,所以在使用之前需要先安装它。pip 
- 本文实例讲述了JS 设计模式之:单例模式定义与实现方法。分享给大家供大家参考,具体如下:良好的设计模式可以显著提高代码的可读性,降低复杂度和
- Django中间件在http请求 到达视图函数之前 和视图函数return之后,django会根据自己的规则在合适的时机执行中间件中相应的方
- 使用vscode的过程中 自己或者push代码以后 代码的格式可能会出现错乱,作为一个成熟的开发 , 当然应该遵守一些代码规范, 首先代码整
- Fiddler,这个是所有软件开发者必备神器!这款工具不仅可以抓取PC上开发web时候的数据包,而且可以抓取移动端(Android,Ipho
- 一、统计数组 arr 中值等于 item 的元素出现的次数function count(arr, item) { var co
- 在开发Windows应用程序时,我们经常需要进行测试来确保程序的质量和稳定性。手动测试是一种常见的方法,但是它非常耗时和繁琐,特别是对于大型
- table通过使用下面语句创建:create table userinfo(name text, email text)更快地插入数据在此用
- 本文是对《Python Qt GUI快速编程》的第9章的堆叠窗口例子Vehicle Rental用Python3+PyQt5+Qt Desi