【发布时间】: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
【问题讨论】:
-
您可以使用标准库
traceback打印my_method中的调用堆栈来诊断此问题。大概在父类中发生了一些事情。 docs.python.org/3/library/traceback.html#traceback.print_stack -
非常感谢这个提示,我会用这个信息更新我的问题。不幸的是,我不知道如何介入这种行为。
-
那么你需要一个调试器。
pdb与 django runserver 一起使用。 docs.python.org/3/library/pdb.html -
也许这种行为有点特别。我想去掉 post_save 信号并在模型保存方法中重新实现它。
-
也许你可以列出所有信号。 stackoverflow.com/questions/1087730/…