我有一个管理表单,其中有几个用于显示 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 的一部分...但我有两个内联。
那么我如何找到最顶层的保存方法,以便在所有模型都经过验证并保存到数据库后调用我的聚合函数?
最佳答案
为了捕获对 ManyToManyField
的更改,您需要连接 m2m_changed
信号。您可能想查看 signals 的文档一般和m2m_changed signal特别是。
关于python - Django 管理后保存方法 - 怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7604218/