自定义 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
在 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