Django管理后台保存后的方法 - 怎么做?

2 投票
1 回答
3553 浏览
提问于 2025-04-17 03:23

我有一个管理表单,里面有几个内联字段用来显示多对多关系的内容,像这样:

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,它需要从两个内联字段中汇总一些数据。所以我写了一个函数 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() 函数中调用这个函数时,后续的多对多字段会产生过时的结果。即使下面这个简单的例子也没有帮助:

class ArticleAdmin(admin.ModelAdmin):
    #...
    def save_model(self, request, obj, form, change):
        obj.save()
        create_code(obj)
        obj.save()

当我进入 InlineFormset 的 clean() 方法时,我可以访问它表单的数据,这样我就能在实际保存之前找出一部分 article_code 的内容……但我有两个内联字段。

那么,我该如何找到最上层的保存方法,以便在所有模型都经过验证并保存到数据库后调用我的汇总函数呢?

1 个回答

1

为了捕捉到对一个 ManyToManyField 的变化,你需要连接上 m2m_changed 信号。你可能想看看关于 信号 的文档,特别是 m2m_changed 信号 的部分。

撰写回答