Django利用LogEntry生成历史操作实战记录

在开发测试平台的时候,虽然对某些关键功能做了权限设置,但毕竟是公司多人使用,有些数据的配置可能不小心被他人修改但未告知其他使用者,造成了诸多不便。所以决定开发一个操作历史表,可以方便查看数据地改动。
LogEntry是在后台开发中经常用到的模块,它在admin是默认开启的。
可以使用LogEntry模块记录所有用户的操作记录。一方面可以用来监督,另一方面可以用来做回滚。

使用LogEntry

ModelAdmin本身就有日志记录功能。当新建一个实体(Post、Category、Tag)时,ModelAdmin会创建一条变更日志记录。当修改一条内容时,ModelAdmin又会调用LogEntry来创建一条日志,记录这个变更。
ModelAdmin内部提供了两个方法,分别是log_addition和log_change。
log_addition记录新增日志。
log_change记录变更日志。
log_deletion记录删除日志。
我们可以看它们的定义来学习LogEntry模块
代码位置:Lib\site-packages\django\contrib\admin\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,
    )

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
  • object_repr:实例的展示名称,可以简单理解为我们定义的__str__所返回的内容
  • action_flag:操作标记。admin的Model里面定义了几种基础的标记: ADDITION、CHANGE和DELETION。它用来标记当前参数是数据变更、新增,还是删除。
  • change_message:这是记录的消息,可以自行定义。我们可以把新添加的内容放进去(必要时可以通过这里来恢复),也可以把新旧内容的区别放进去。

理解了这几个参数,如果遇到类似的需求,就能直接使用Django现成的工具来完成了。

查询某个对象的变更

上面我们知道如何记录某个对象的变更日志了,那么问题来了,如何在询已经记录的变更呢?
其实这是简单的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).id,
    object_id=post.id)

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

在admin页面上查看操作日志

我们既知道如何记录变更日志,也知道如何获取变更日志,那么如何才能够在admin后台方便地查看操作日志呢?
新增如下配置(admin.py):

#最上面增加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']

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

实战

虽然操作历史显示出来了,但是在django自带的admin后台才能看到,不是所有人都有进入admin后台权限,能不能有一种方法能在前端展示出来让每个人都可以查看呢?
前端代码:

<table class="table table-bordered" style="width: 60%;margin-left: 20%;text-align: center">
   <caption style="text-align: center">
    <span style="font-size: large;color: black">项目:【<span style="color: pink">{{ client.name }}</span>】的操作记录: </span>
   </caption>
   <thead>
    <tr style="background-color: #cdd8e5">
     <th style="width: 100px;text-align: center">操作时间</th>
     <th style="width: 200px;text-align: center">操作对象</th>
     <th style="width: 50px;text-align: center">对象id</th>
     <th style="width: 100px;text-align: center">动作标志</th>
     <th style="width: 100px;text-align: center">操作用户</th>
     <th style="width: 300px;text-align: center">修改内容</th>
    </tr>
   </thead>
   <tbody>
     {% for i in objects %}
    <tr>
     <td>{{ i.action_time }}</td>
     <td>{{ i.object_repr }}</td>
     <td>{{ i.object_id }}</td>
     <td>{{ i.get_action_flag_display }}</td>
     <td>{{ i.user }}</td>
     <td>{{ i.change_message }}</td>
    </tr> {% endfor %}
   </tbody>
  </table>

这里有个坑,如果就利用{{i.action_flag}}获取操作标记的话,得到的是索引值,经过stackoverflow.com查阅,需要利用Django-doc(用您要在其文本表示形式中“翻译”的字段名称替换)来获取相应值,因此:get_fieldname_display,所以这里要写成{{ i.get_action_flag_display }}

后端代码(views.py):

# 导入所需的包
from django.contrib.admin.models import LogEntry, CHANGE, ADDITION, DELETION
from django.contrib.admin.options import get_content_type_for_model

res = dict()
res['objects'] = LogEntry.objects.all()  # 获取到所有操作历史
# 只需要调用LogEntry.objects.log_action方法带入所需参数即可
LogEntry.objects.log_action(
        user_id=request.user.pk,  # 操作用户的id
        content_type_id=get_content_type_for_model(object).pk,  # 对应数据库Model的id
        object_id=object.pk,  # 操作对象的id
        object_repr=object_repr,  # 操作对象的名字
        action_flag=DELETION,  # ADDITION、CHANGE和DELETION三种方式选择合适的
        change_message=''  # 自定义消息,可以放入修改之后的数据
    )

实现效果

参考资料:https://www.cnblogs.com/zihao1037/p/11057341.html

到此这篇关于Django利用LogEntry生成历史操作的文章就介绍到这了,更多相关Django历史操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Django利用LogEntry生成历史操作实战记录

    在开发测试平台的时候,虽然对某些关键功能做了权限设置,但毕竟是公司多人使用,有些数据的配置可能不小心被他人修改但未告知其他使用者,造成了诸多不便.所以决定开发一个操作历史表,可以方便查看数据地改动. LogEntry是在后台开发中经常用到的模块,它在admin是默认开启的. 可以使用LogEntry模块记录所有用户的操作记录.一方面可以用来监督,另一方面可以用来做回滚. 使用LogEntry ModelAdmin本身就有日志记录功能.当新建一个实体(Post.Category.Tag)时,Mod

  • Oracle导出导入表结构操作实战记录

    1.Plsql —工具 — 导出用户对象 2.输出文件路径查看导出的xx.sql文件 3.数据库A导表进数据库B,先在B库建立相同的表空间 临时表空间可不需要 创建表空间 create tablespace USER_DEF_DATA logging datafile '/data/oracle/app/oracle/oradata/lcfa/test_lcfa6.dbf' size 1024M autoextend on next 100m maxsize 20480M extent mana

  • Mysql8创建用户及赋权操作实战记录

    目录 1.进入mysql 2.创建用户 3.给用户赋权 4.查看用户权限 5.撤销用户权限 6.删除用户 7.查询所有用户及其权限 附:查看用户权限 总结 1.进入mysql mysql -uroot -p 2.创建用户 create user 'testuser1'@'%' identified by '123456'; 这里表示创建一个不限制ip登录的用户 testuser1 该用户的密码是 123456 %代表不限制ip登录 刷新权限,每一次权限更改后都刷新一下 flush privile

  • Laravel框架实现利用中间件进行操作日志记录功能

    本文实例讲述了Laravel框架实现利用中间件进行操作日志记录功能.分享给大家供大家参考,具体如下: 利用中间件进行操作日志记录过程: 1.创建中间件 php artisan make:middleware AdminOperationLog 2.生成了文件./app/Http/Middleware/AdminOperationLog.php 代码如下: <?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\R

  • Android利用zxing生成二维码的过程记录

    目录 二维码生成原理(即工作原理) 效果图如下: 前提: 源码如下: 总结 二维码生成原理(即工作原理) 二维码官方叫版本Version.Version 1是21 x 21的矩阵,Version 2是 25 x 25的矩阵,Version 3是29的尺寸,每增加一个version,就会增加4的尺寸,公式是:(V-1)*4 + 21(V是版本号) 最高Version 40,(40-1)*4+21 = 177,所以最高是177 x 177 的正方形. 下面是一个二维码的样例: 效果图如下: 前提:

  • 利用uni-app生成微信小程序的踩坑记录

    目录 前言 1.不允许id选择器 2.默认竖排 3.图片加载不出来 4.eval函数不可用 5.getStorage异步 6.props的中的值不可修改 7.wx.uploadFile携带字符串参数 8.picker的multiSelector mode中选择框出现undefined 总结 前言 毕设要求写一个浏览器端,一个APP端,一个微信端,刚开始以为要学三个技术然后写三个客户端,后来知道了uni-app这个神器,一次编写就可以编译生成APP.H5以及各种小程序版本的客户端.然而我比较熟悉的

  • django上传图片并生成缩略图方法示例

    django 处理上传图片生成缩略图首先要注意form标签上必须有enctype="multipart/form-data"属性,另外要装好PIL库, 然后就很简单了,如下是实例代码: upload.html <div id="uploader"> <form id="upload" enctype="multipart/form-data" action="/ajax/upload/"

  • django之跨表查询及添加记录的示例代码

    创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many); 一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany("要绑定关系的表名")  会自动

  • Django利用elasticsearch(搜索引擎)实现搜索功能

     1.在Django配置搜索结果页的路由映射 """pachong URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.10/topics/http/urls/ Examples: Function views 1. Add an import: from my_ap

  • C#多线程开发实战记录之线程基础

    目录 前言 线程基础 1.创建线程 2.暂停线程 3.线程等待 4.线程终止 C#中的lock关键字 总结 前言 最近由于工作的需要,一直在使用C#的多线程进行开发,其中也遇到了很多问题,但也都解决了.后来发觉自己对于线程的知识和运用不是很熟悉,所以将利用几篇文章来系统性的学习汇总下C#中的多线程开发. 线程基础 "进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元" 这句话应该学习计算机的朋友或多或少都听说过,这在操作系统这门课中是很重要的一个概念. 在操作系统中可以同时

随机推荐