Django模型导出操作日志记录问题:自定义export_action未触发
解决导出操作日志未触发的问题
问题根源
你重写的方法名错误——ExportActionMixin中处理导出动作的核心方法并非export_action,而是export_selected_objects(对应django-import-export标准实现),导致自定义日志逻辑从未被执行。
修正方案
1. 修改Admin类代码
将日志逻辑移至正确的方法中,同时优化日志参数的可读性:
from django.contrib.contenttypes.models import ContentType from django.contrib.admin.models import LogEntry class RegAdmin(ExportActionMixin, admin.ModelAdmin): resource_class = RegAdminResource # 显式注册导出动作(Mixin默认已添加,手动声明避免版本兼容问题) actions = ["export_selected_objects"] def has_view_permission(self, request, obj=None): return True def has_module_permission(self, request): return True def export_selected_objects(self, request, queryset): # 记录导出操作日志 LogEntry.objects.create( user=request.user, content_type=ContentType.objects.get_for_model(self.model), object_id=None, object_repr=f"导出 {self.model._meta.verbose_name_plural} 数据", action_flag=4, # 用自定义标识区分导出(默认1=新增、2=修改、3=删除) change_message=f"成功导出 {queryset.count()} 条记录" ) # 执行父类的导出逻辑 return super().export_selected_objects(request, queryset)
2. 可选:优化日志显示
在CustomLogEntryAdmin中添加自定义动作类型显示,让导出操作更直观:
class CustomLogEntryAdmin(admin.ModelAdmin): list_display = [ "action_time", "user", "content_type", "object_id", "object_repr", "get_action_type", "change_message", ] list_filter = ["action_time", "user", "content_type"] search_fields = ["user__username", "object_repr"] def get_action_type(self, obj): action_map = { 1: "新增", 2: "修改", 3: "删除", 4: "导出" } return action_map.get(obj.action_flag, f"未知({obj.action_flag})") get_action_type.short_description = "操作类型"
额外注意事项
- 若使用旧版本django-import-export,可查看
ExportActionMixin源码确认导出方法的准确名称; - 日志中
object_id设为None符合批量导出场景,无需关联单个对象。
内容的提问来源于stack exchange,提问作者Sami Malik
相关产品推荐
相关产品推荐

