自定义w页面模型保存方法调用两次 [英] Custom wagtail page model save method called twice

查看:40
本文介绍了自定义w页面模型保存方法调用两次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

In a Django+Wagtail project, I have a custom method which I call from the model save() method. It works - but everytime I save an instance via the wagtail admin interface, this method is called twice - why?

# 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åkenLid 的建议使用 traceback.print_stack 我发现该方法首先通过

By using traceback.print_stack as suggested by Håken Lid I've found out that the method is first called via

  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()

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

But even with this information I'm not aware how to only trigger my method on the second save...

环境:
Django 2.0.4
2.0.1

Env:
Django 2.0.4
Wagtail 2.0.1

推荐答案

如果要在页面发布中执行某些操作,则可以使用 page_published 信号,如下所示:

In case you want to do something on page publish, You can use the page_published signals as below:

    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 参数:

In case of save, you can also check the update_fields argument in the kwargs:

    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)

有关w信号代码的更多信息,请访问以下链接这是官方文档 http://docs.wagtail.io/en/v1.7/reference/signals.html

For more info about wagtail signal code visit this link and this for the official docs http://docs.wagtail.io/en/v1.7/reference/signals.html

这篇关于自定义w页面模型保存方法调用两次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆