文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Django如何利用LogEntry生成历史操作

2023-06-22 04:24

关注

小编给大家分享一下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方法,只是参数略有不同,可以看到,如果需要自定义变更记录的话,只需要传递对应的参数即可。以下简要介绍一下这些参数。

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

查询某个对象的变更

上面我们知道如何记录某个对象的变更日志了,那么问题来了,如何在询已经记录的变更呢?
其实这是简单的Model查询问题。假设我们记录的对象是Post的操作,现在来获取Post中id为1的所有变更日志,大概代码如下:

from django.contrib.admin.models import LogEntry, CHANGEfrom django.contrib.admin.options import get_content_type_for_modelpost = 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):

#最上面增加importfrom 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如何利用LogEntry生成历史操作

实战

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

<table class="table table-bordered" >    <caption >    <span >项目:【<span >{{ client.name }}</span>】的操作记录: </span>   </caption>    <thead>     <tr >      <th >操作时间</th>      <th >操作对象</th>      <th >对象id</th>      <th >动作标志</th>      <th >操作用户</th>      <th >修改内容</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, DELETIONfrom django.contrib.admin.options import get_content_type_for_modelres = 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=''  # 自定义消息,可以放入修改之后的数据    )

实现效果

Django如何利用LogEntry生成历史操作

看完了这篇文章,相信你对“Django如何利用LogEntry生成历史操作”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯