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
相关产品推荐
相关产品推荐

