如何在Django Admin中为代理模型显示变更字段?
解决Django代理模型Admin历史页面不显示变更字段的问题
你的问题核心在于代理模型没有独立的历史记录存储,且当前Admin类未正确集成simple_history的增强功能,下面一步步帮你搞定:
问题根源
你给Managers模型绑定了HistoricalRecords,但代理模型MyManagers本身没有专属的历史表,它的历史记录实际指向的是Managers的历史表。同时,你当前的MyManagersAdmin继承的是普通ModelAdmin,而simple_history提供的history_list_display等历史增强属性只有SimpleHistoryAdmin才会识别并渲染。
具体解决方案
1. 导入并继承SimpleHistoryAdmin
首先要从simple_history导入专用的Admin基类,让你的两个Admin类都继承它,这样才能启用历史页面的字段展示功能:
修改models.py中的Admin类定义:
from django.contrib import admin from simple_history.models import HistoricalRecords from simple_history.admin import SimpleHistoryAdmin # 新增导入 class Managers(models.Model): name = models.CharField(max_length=30, default='') lastname = models.CharField(max_length=30, default='') enduser_id = models.CharField(max_length=8, default='', help_text=u"Please enter the end user id, like ABC1WZ1") history = HistoricalRecords() class Meta: verbose_name = 'Manager' verbose_name_plural = 'Managers' def __str__(self): return self.name + self.lastname # 改为继承SimpleHistoryAdmin class ManagersAdmin(SimpleHistoryAdmin): list_display= ('name','lastname','enduser_id') history_list_display = ['name','lastname','enduser_id'] # 可选:配置原模型历史页面显示字段 class MyManagers(Managers): class Meta: proxy=True def __str__(self): return self.name.upper() +' '+self.lastname.upper() # 同样改为继承SimpleHistoryAdmin class MyManagersAdmin(SimpleHistoryAdmin): search_fields = ['name', 'lastname','enduser_id'] list_display = ('name', 'lastname','enduser_id') history_list_display = ['name','lastname','enduser_id','changed_fields'] def changed_fields(self, historical_obj): # 注意:这里的参数是历史记录对象(HistoricalManagers实例),而非代理模型实例 if historical_obj.prev_record: diff = historical_obj.diff_against(historical_obj.prev_record) # 仅返回变更字段名 return ", ".join(diff.changed_fields) # 如果想要显示具体变更值,可以替换为下面的代码: # changes = [] # for field, change in diff.changes.items(): # changes.append(f"{field}: {change.old} → {change.new}") # return "<br>".join(changes) return "无历史记录" # 如果使用了HTML格式的变更详情,需要添加这个属性允许渲染HTML # changed_fields.allow_tags = True
2. 确认simple_history配置正确
确保你的settings.py中已经添加了simple_history到INSTALLED_APPS:
INSTALLED_APPS = [ # ... 其他应用 'simple_history', ]
3. 迁移数据库(若未执行过)
执行迁移命令确保历史表已正确创建:
python manage.py makemigrations python manage.py migrate
效果验证
重启Django服务后,进入MyManagers的Admin页面,修改一条记录后查看历史,你会看到新增的changed_fields列,清晰展示出具体变更的字段(或字段的前后值,如果你启用了详情版本)。
内容的提问来源于stack exchange,提问作者Shyrokoa
相关产品推荐
相关产品推荐

