Django admin后保存方法 - 怎么办?

时间:2011-09-29 22:44:46

标签: python django inline admin

我有一个带有几个内联的管理表单,用于显示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之后调用我的聚合函数?

1 个答案:

答案 0 :(得分:1)

为了捕捉ManyToManyField的更改,您需要连接m2m_changed信号。您可能希望查看signals的文档,特别是m2m_changed signal