Wagtail 'View live' 按钮在创建页面后使用 id 作为 slug 时提供了错误的 url

Wagtail 'View live' button provides wrong url after page creation while using id as slug

我有一个使用页面 ID 作为 slug 的案例,在创建新页面后,Wagtail 为我们提供了一个“查看实时”按钮,但是当我们点击该按钮时,它提供了一个错误 URL

右边的URL应该是".../property-list/"

我搜索了堆栈溢出,找到了这个线程,但答案仍然是个谜: Wrong 'View live' url in Wagtail admin message after page creation when using id as slug

关注了Wagtail官方文档,使用Wagtail Hooks操作数据。然而,还没有成功。这是我的代码:

@hooks.register('after_create_page')
def set_number_and_slug_after_property_page_created(request, page):
    page.number = page.slug = str(page.id)
    page.save()
    new_revision = page.save_revision()
    if page.live:
        new_revision.publish()

请帮帮我,谢谢。

after_create_page 挂钩对此不起作用,因为它是由 Django 提供的 one of the last things to run during the Wagtail admin's page creation view, and the confirmation message (including the old URL) has already been constructed by that point. This can be remedied by using the post_save signal - 作为一种更 low-level 的机制,它与保存行为更紧密地联系在一起数据库记录,没有 Wagtail 的管理逻辑妨碍。

(还有一点future-proof: Wagtail的after_create_page钩子被设计为当用户经过的页面创建区域时被调用Wagtail 管理员,以便在适当的情况下通过管理员自定义该用户的路径。如果有任何其他途径可以创建页面 - 比如,数据导入,或使用翻译工具 multi-language 站点 - 然后 after_create_page 将被绕过,但 post_save 信号仍将被触发。)

假设您的项目有一个 properties 应用程序,您在其中定义 PropertyPage 模型,您的代码可以重写为使用 post_save,如下所示 - 在 properties/signals.py:

from django.db.models.signals import post_save
from django.dispatch import receiver

from .models import PropertyPage


@receiver(post_save)
def set_number_and_slug_after_property_page_created(sender, instance, created, **kwargs):
    if issubclass(sender, PropertyPage) and created:
        page = instance
        page.number = page.slug = str(page.id)
        page.save()
        new_revision = page.save_revision()
        if page.live:
            new_revision.publish()

然后,要在服务器启动时连接此信号,创建一个包含以下内容的 properties/apps.py(或者如果您有 AppConfig class,则只需添加/编辑 ready 方法已经):

from django.apps import AppConfig


class PropertiesConfig(AppConfig):
    name = 'properties'

    def ready(self):
        from . import signals