消息框架:在 Wagtail 中保存页面 class 时添加消息

Message framework: Add message when saving Page class in Wagtail

所以我想检查某个字段是否已更改,如果已更改,则向用户显示一条信息消息,告知他们应该查看其他数据点。我觉得 Django 消息框架应该是这方面的理想选择,但我找不到挂钩到 wagtail 页面的位置 class 以使其工作。

现在我检查了页面的保存方法,如下所示,但我无权访问这里的请求对象,所以我不能使用 massage.add_message(因为它使用请求对象作为一个参数)。

我错过了什么?

    def save(self, *args, **kwargs):
    super().save(*args, **kwargs)

    if self.pk is not None:
        original = EventDetail.objects.get(pk=self.pk)
        if (
            original.start_date != self.start_date
            and self.messages.all().count() > 0
        ):
            messages.add_message(
                request,
                messages.INFO,
                _(
                    "You have just changed starting time on an event that contains messages, please review the times for the message sends."
                ),
            )

编辑 @gasman回复后,我的新before_edit钩子现在是这样的,可以这样吗以更pythonic的方式?与请求相比似乎有点 hack,但我看不到任何其他解决方案?

@hooks.register("before_edit_page")
def before_edit_page(request, page_object):
    if isinstance(page_object, EventDetail):
        if request.POST:
            original = EventDetail.objects.get(pk=page_object.pk)
            if (
                page_object.live == True
                and request.POST["start_date"]
                and datetime.datetime.strptime(
                    request.POST["start_date"], "%Y-%m-%d %H:%M"
                )
                != original.start_date
                and page_object.messages.filter(sent=False).count() > 0
            ):
                messages.add_message(
                    request,
                    messages.WARNING,
                    _(
                        "You have changed the start time of an event that has unsent messages. Please review the timing of the messages."
                    ),
                )

与其在模型的 save 方法中执行此操作,不如定义一个 after_edit_page 挂钩函数。这是在通过 Wagtail 管理员编辑页面后调用的,并允许您访问页面对象和请求。