Django admin日志记录模块的使用,拓展LogEntry日志记录跳转改动详情页,日志搜索等功能

1、django admin日志记录引入

在使用django admin开发后台管理系统时,可以在admin模块中将django admin自带的操作日志记录模块注册到管理面板
from django.contrib.admin.models import LogEntry

可以看到引入后django admin的菜单栏新增出了一条日志记录的按钮
在这里插入图片描述

这里对应的数据,就是django初始化时创建的django_admin_log

在这里插入图片描述

2、问题引入

但是这个界面我们可以看到,单数据库中发生了数据变动(修改,新增,更新)时,会自动写入数据到日志记录中,但是目前这个界面无法跳转到修改的详情页,当模块偏多时,在运维时就无法定位到具体的修改位置。因此,为了实现能够通过日志记录跳转到改动详情,我们需要继承LogEntry类,并增加函数。

3、解决方案

3.1实现思路

我们通过观察django_admin_log表可以看到有两个关键字段,一个是object_id,一个是content_type_id
其中content_type_id与django表django_content_type的id关联。

通过表中的{app_label}_{model}的形式可以找到对应的数据库表,再通过object_id即可找到对应的修改字段了
在这里插入图片描述

3.2拓展LogEntry,新增跳转详情链接

在admin.py中新增代码,继承LogEntry,新定义一个view_link方法表示我们的跳转链接。对于更新或者新增操作添加一列跳转按钮,通过django_content_type表中的app_label和model字段构建跳转链接,拼接出一个a标签进来返回。最后加入到list_display属性中,就能在界面最后看到一个view的跳转按钮了。点击跳转到对应的数据详情页。 于是同时,还得保留权限校验,确保只有有权限的用户才能跳转。

from django.contrib import admin
from django.contrib.admin.models import LogEntry
from django.utils.html import format_html
from django.urls import reverse
@admin.register(LogEntry)
class LogOperateAdmin(admin.ModelAdmin):
    list_display = ('action_time', 'content_type', 'user','get_edited_object', '__str__')

    def has_add_permission(self, request):
        return False

    def has_change_permission(self, request, obj=None):
        return False

    def has_delete_permission(self, request, obj=None):
        return False

    def view_link(self, obj):
        if obj.action_flag != 3 and obj.object_id:
            ct = obj.content_type
            view_url = reverse('admin:%s_%s_change' % (ct.app_label, ct.model), args=[obj.object_id])
            return format_html('<a href="{}">View</a>', view_url)
        return ""
    
    list_display += ('view_link',)

在这里插入图片描述

3.3拓展LogEntry,支持日志记录的搜索

接下来加入搜索其实就是django admin的相对通用的操作了,添加search_fields,添加时间范围过滤搜索等

from django.utils.translation import gettext_lazy as _
from django.contrib.admin import DateFieldListFilter

class CustomDateRangeFilter(DateFieldListFilter):
    title = _('时间范围')

    def __init__(self, *args, **kwargs):
        super(CustomDateRangeFilter, self).__init__(*args, **kwargs)

@admin.register(LogEntry)
class LogOperateAdmin(admin.ModelAdmin):
    list_display = ('action_time', 'content_type', 'user','get_edited_object', '__str__')
    list_filter = (('action_time', CustomDateRangeFilter), 'content_type')  # 添加自定义时间范围过滤器和 content_type 下拉框
    search_fields = ('object_id', 'object_repr')  # 添加对其他字段的搜索支持
    def has_add_permission(self, request):
        return False

    def has_change_permission(self, request, obj=None):
        return False

    def has_delete_permission(self, request, obj=None):
        return False

    def view_link(self, obj):
        if obj.action_flag != 3 and obj.object_id:
            ct = obj.content_type
            view_url = reverse('admin:%s_%s_change' % (ct.app_label, ct.model), args=[obj.object_id])
            return format_html('<a href="{}">View</a>', view_url)
        return ""
    
    list_display += ('view_link',)

在这里插入图片描述

结束

需要获取源码的可以关注公众号"一颗程序树",点击菜单栏的免费源码-源码集合的页面中输入关键词。或者菜单栏点击“联系我们”按钮咨询问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Demonslzh6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值