Пользовательский метод сохранения модели страницы трясогузки вызывается дважды - PullRequest
0 голосов
/ 14 мая 2018

В проекте Django + Wagtail у меня есть собственный метод, который я вызываю из метода модели save(). Это работает - но каждый раз, когда я сохраняю экземпляр через интерфейс администратора трясогузки, этот метод вызывается дважды - почему?

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

Используя traceback.print_stack, как предложено Håken Lid Я обнаружил, что метод сначала вызывается через

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

Но даже с учетом этой информации я не знаю, как вызвать только мой метод при втором сохранении ...

ENV:
Джанго 2.0.4
Трясогузка 2.0.1

1 Ответ

0 голосов
/ 21 мая 2018

Если вы хотите что-то сделать при публикации страницы, вы можете использовать сигналы 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)

В случае сохранения вы также можете проверить аргумент update_fields в 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)

Для получения дополнительной информации о сигнальном коде трясогузки посетите эту ссылку и это для официальных документов http://docs.wagtail.io/en/v1.7/reference/signals.html

...