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']

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

最新文章

  1. Go语言实战 - revel框架教程之用户注册
  2. Notification Once
  3. 批量扫描互联网无线路由设备telnet,并获取WIFI密码
  4. 怎么用程序获取远程url执行后的图片地址
  5. help python(查看模块帮助文档)
  6. MySQL user表root用户误删除后恢复
  7. pickle模块
  8. 面试中的Singleton
  9. 大数据加减(Big data addition and subtraction)
  10. mybatis 详解(六)------通过mapper接口加载映射文件
  11. DQL、DML、DDL、DCL
  12. typeof与instanceof的区别
  13. JDBC-DBCP
  14. Hadoop生态组件的WebUI地址
  15. LINUX_正则表达式
  16. 美团店铺评价语言处理以及分类(tfidf,SVM,决策树,随机森林,Knn,ensemble)
  17. Hibernate 再接触 关系映射 一对一单向外键关联
  18. POJ 1459 && ZOJ 1734--Power Network【最大流dinic】
  19. 多条件搜索问题 -sql拼接与参数化查询
  20. Acdream1311_Apple

热门文章

  1. ASP.NET 使用 Dispose 释放资源的四种方法
  2. python并行计算之mpi4py的安装与基本使用
  3. NFLSOJ 1060 - 【2021 六校联合训练 NOI #40】白玉楼今天的饭(子集 ln)
  4. P4550 收集邮票 与 灵异的期望
  5. map与unordered_map区别及使用
  6. 水平梯度在sigma坐标对应形式
  7. R语言与医学统计图形-【29】地图的绘制
  8. 关于ARM的PC指针(什么时候PC+8,PC+4,PC-4,PC-8)转
  9. 商业创新不能等?用友低代码开发平台YonBuilder为您加速!
  10. 基于《CSAPP第九章 虚拟内存》的思考和总结