You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:18:18