这篇文章主要介绍“Django记录操作日志与LogEntry的使用方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Django记录操作日志与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现成的工具来完成了。
上面我们知道如何记录某个对象的变更日志了,那么问题来了,如何在询已经记录的变更呢?
其实这是简单的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的所有变更记录了。
我们既知道如何记录变更日志,也知道如何获取变更日志,那么如何才能够在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']
这样就可以看到所有的变更记录了。如下图所示:
关于“Django记录操作日志与LogEntry的使用方法是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。