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