Django记录操作日志、LogEntry的使用
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']
这样就可以看到所有的变更记录了。如下图所示:
最新文章
- Go语言实战 - revel框架教程之用户注册
- Notification Once
- 批量扫描互联网无线路由设备telnet,并获取WIFI密码
- 怎么用程序获取远程url执行后的图片地址
- help python(查看模块帮助文档)
- MySQL user表root用户误删除后恢复
- pickle模块
- 面试中的Singleton
- 大数据加减(Big data addition and subtraction)
- mybatis 详解(六)------通过mapper接口加载映射文件
- DQL、DML、DDL、DCL
- typeof与instanceof的区别
- JDBC-DBCP
- Hadoop生态组件的WebUI地址
- LINUX_正则表达式
- 美团店铺评价语言处理以及分类(tfidf,SVM,决策树,随机森林,Knn,ensemble)
- Hibernate 再接触 关系映射 一对一单向外键关联
- POJ 1459 &;amp;&;amp; ZOJ 1734--Power Network【最大流dinic】
- 多条件搜索问题 -sql拼接与参数化查询
- Acdream1311_Apple
热门文章
- ASP.NET 使用 Dispose 释放资源的四种方法
- python并行计算之mpi4py的安装与基本使用
- NFLSOJ 1060 - 【2021 六校联合训练 NOI #40】白玉楼今天的饭(子集 ln)
- P4550 收集邮票 与 灵异的期望
- map与unordered_map区别及使用
- 水平梯度在sigma坐标对应形式
- R语言与医学统计图形-【29】地图的绘制
- 关于ARM的PC指针(什么时候PC+8,PC+4,PC-4,PC-8)转
- 商业创新不能等?用友低代码开发平台YonBuilder为您加速!
- 基于《CSAPP第九章 虚拟内存》的思考和总结