自定义 wagtail 页面模型保存方法调用两次

Custom wagtail page model save method called twice

在 Django+Wagtail 项目中,我有一个从模型 save() 方法中调用的自定义方法。它有效 - 但每次我通过 wagtail 管理界面保存实例时,此方法都会被调用两次 - 为什么?

# models.py
from wagtail.core.models import Page

class ArticlePage(Page):

    def my_method(self):
        print('I will be printed twice on save...')

    def save(self, *args, **kwargs):
        self.my_method() 
        super().save(*args, **kwargs)

按照 Håken Lid 的建议使用 traceback.print_stack 我发现该方法首先是通过

调用的
  File ".../.venv/lib/python3.6/site-packages/wagtail/admin/views/pages.py", line 336, in edit
    submitted_for_moderation=is_submitting,
  File ".../.venv/lib/python3.6/site-packages/wagtail/core/models.py", line 653, in save_revision
    self.save(update_fields=update_fields)

第二次通过

  File ".../.venv/lib/python3.6/site-packages/wagtail/admin/views/pages.py", line 343, in edit
    revision.publish()
  File ".../.venv/lib/python3.6/site-packages/wagtail/core/models.py", line 1498, in publish
    page.save()

但即使有了这些信息,我也不知道如何只在第二次保存时触发我的方法...

环境:
Django 2.0.4
鹡鸰 2.0.1

如果您想在页面发布上做一些事情,您可以使用下面的 page_published 信号:

    from django.dispatch import receiver
    from wagtail.core.signals import page_published
    @receiver(page_published)
    def do_stuff_on_page_published(instance, **kwargs):
        print('=======================',instance,kwargs)

保存的情况下,还可以检查kwargs中的update_fields参数:

    def save(self, *args, **kwargs):
        if kwargs.get('update_fields'):
            pass # save not called from publish
            # do_stuff_on_save()
        else:
            pass
            # do_stuff_on_publish()
        return super().save(*args, **kwargs)

有关鹡鸰信号代码的更多信息,请访问此 link 这是官方文档 http://docs.wagtail.io/en/v1.7/reference/signals.html