【问题标题】:Custom wagtail page model save method called twice自定义 wagtail 页面模型保存方法调用了两次
【发布时间】:2018-10-23 22:46:41
【问题描述】:

在 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

【问题讨论】:

标签: django wagtail


【解决方案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

【讨论】:

  • 我已经通过post_save 信号完成了这项工作,它按预期工作,但我想用自定义保存方法交换信号处理。
  • 在这种情况下,如果 kwargs.get('update_fields'):
  • 在发布的情况下,保存调用两个,一个默认使用 update_fields,另一个来自 post 方法,没有 update_fields 参数
  • 非常感谢@prakash,你的第二个例子很有魅力。
猜你喜欢
  • 1970-01-01
  • 2018-02-06
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
相关资源
最近更新 更多