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

Django2.2.4版本ModelAdmin添加页Inline表单重复渲染问题求助

问题原因及修复方案

1 优先排查重复导入问题

这是最常见的触发原因:如果你的项目中admin.py文件被重复导入,会导致TestMyModelCreate被重复注册到Admin站点,同一个ModelAdmin的Inline列表会被重复加载,最终表现为Inline表单重复渲染。
验证方法:在admin.site.register(MyModel, TestMyModelCreate)这行代码前加一行打印语句,启动项目后看控制台是否输出两次,如果是则说明存在重复导入,检查项目的urls.py、apps.py等配置文件中是否重复导入了admin模块即可解决。

2 Django 2.2.4 已知Bug

如果排除了重复导入问题,该问题是Django 2.2.4版本的官方已知Bug,由新增视图中Inline实例的计数逻辑错误导致,在2.2.5及后续版本已经修复。可以选择以下任意一种方案解决:

  • 方案1:升级Django版本(推荐)
    直接将Django升级到2.2.5或更高的2.2.x稳定版,即可从根源解决该问题,无需修改业务代码。
  • 方案2:临时修改外键字段属性
    如果暂时无法升级Django版本,可以给关联模型的外键字段添加editable=False参数,修改models.py中RelatedModel的定义:
class RelatedModel(models.Model):
    parent = models.ForeignKey(MyModel, null=False, on_delete=models.CASCADE, editable=False)
    number = models.DecimalField(decimal_places=2, max_digits=10, null=False, blank=False)

该外键本身不会在Inline表单中显示,添加editable=False不会影响正常功能。

  • 方案3:重写get_inlines方法强制去重
    也可以在ModelAdmin中重写get_inlines方法,手动对Inline列表去重,避免重复加载:
class TestMyModelCreate(admin.ModelAdmin):
    fields = ['text', ]
    inlines = [RelatedModelInlineTabular]
    
    def get_inlines(self, request, obj=None):
        inline_dict = {}
        for inline in super().get_inlines(request, obj):
            inline_dict[inline.__name__] = inline
        return list(inline_dict.values())

内容的提问来源于stack exchange,提问作者Salvioner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:24:03