我有一个带有几个内联的管理表单,用于显示m2m字段,如下所示:
class ArticleAdmin(admin.ModelAdmin):
form = ArticleCustomAdminForm
inlines = (SpecificGemInline, SuiteInline,)
基类看起来像这样:
class Article(models.Model):
article_code = models.CharField(max_length=15)
gems = models.ManyToManyField(Gem, through='SpecificGem')
模型有一个特殊字段article_code
,它应该聚合来自两个内联中表示的m2m字段的一些数据,所以我编写了一个函数create_code(instance)
,它通过直接访问模型实例字段来完成,类似于的是:
def create_code(instance):
article_code_part1 = SpecificGem.objects.filter(article=instance)
article_code_part2 = instance.suite_set.all()
instance.article_code = #do something with both parts
问题是,当我从覆盖ModelAdmin的save_model()
或模型的save()
函数调用此函数时,以下实例m2m字段会产生过时的结果。即使是下面的延迟例子也无济于事:
class ArticleAdmin(admin.ModelAdmin):
#...
def save_model(self, request, obj, form, change):
obj.save()
create_code(obj)
obj.save()
当我进入InlineFormset的clean()
方法时,我可以访问其表单的数据,因此即使没有实际保存,我也可以找出article_code的一部分......但我有两个内联。
那么我如何找到最顶层的保存方法,所以我可以在验证所有模型并将其保存到db之后调用我的聚合函数?
答案 0 :(得分:1)
为了捕捉ManyToManyField
的更改,您需要连接m2m_changed
信号。您可能希望查看signals的文档,特别是m2m_changed signal。