Django Admin中django-auditlog变更列表自定义:外键显示优化
解决django-auditlog在Admin中显示ForeignKey名称而非ID的问题
针对你遇到的Task模型的stage字段在auditlog日志中显示ID而非Stage名称的问题,有两种可行方案:
方案一:自定义Admin日志显示逻辑(不修改存储的日志数据)
该方案在Admin渲染日志条目时,将stage的ID转换为对应的名称,日志数据库中仍存储ID,适合需要保留原始ID记录的场景。
在项目的admin.py中添加以下代码:
from django.contrib import admin from auditlog.models import AuditLogEntry from auditlog.admin import AuditLogEntryAdmin as DefaultAuditLogEntryAdmin from .models import Stage, Task class CustomAuditLogEntryAdmin(DefaultAuditLogEntryAdmin): def format_field_value(self, obj, field, value): # 针对Task模型的stage字段做特殊处理 if obj.content_type.model_class() == Task and field == "stage": if value is not None: try: stage = Stage.objects.get(pk=value) return str(stage) except Stage.DoesNotExist: return f"Stage (已删除,ID: {value})" # 其他字段沿用默认处理逻辑 return super().format_field_value(obj, field, value) # 取消默认的AuditLogEntry注册,替换为自定义Admin admin.site.unregister(AuditLogEntry) admin.site.register(AuditLogEntry, CustomAuditLogEntryAdmin)
方案二:自定义序列化器(修改日志存储的内容)
该方案在记录日志时,直接存储stage的名称而非ID,Admin显示时无需转换。注意:如果后续Stage的名称被修改,历史日志中仍会记录变更时的名称,不会随Stage名称更新而变化。
在项目的models.py中修改Task模型的auditlog注册逻辑:
from auditlog.registry import auditlog from auditlog.serializers import AuditlogSerializer class TaskAuditlogSerializer(AuditlogSerializer): def get_field_value(self, obj, field_name): value = super().get_field_value(obj, field_name) if field_name == "stage" and value is not None: # 返回Stage的名称而非ID return str(obj.stage) return value # 注册Task模型时指定自定义序列化器 auditlog.register(Task, serializer_class=TaskAuditlogSerializer)
两种方案均可解决你的问题,可根据实际需求选择:若需保留原始ID数据,选方案一;若希望日志直接显示名称,选方案二。
内容的提问来源于stack exchange,提问作者mohsin
相关产品推荐
相关产品推荐

