Django管理后台保存后的方法 - 怎么做?
我有一个管理表单,里面有几个内联字段用来显示多对多关系的内容,像这样:
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 信号 的部分。