1

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

在此处输入图像描述

在此处输入图像描述

正确的 URL 应该是“.../property-list/<property-id>”

我搜索了堆栈溢出,找到了这个线程,但答案仍然是个谜: Wagtail admin message in Wrong 'View live' url in 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()

请帮帮我,谢谢。

4

1 回答 1

1

after_create_page钩子对此不起作用,因为它是Wagtail 管理员页面创建视图期间运行的最后一件事,并且此时已经构建了确认消息(包括旧 URL)。这可以通过使用 Django 提供的post_save信号来解决——作为一种更底层的机制,它与保存数据库记录的行为更紧密地联系在一起,没有 Wagtail 的管理逻辑妨碍。

(它也更面向未来:Wagtail 的after_create_page钩子设计为在用户通过 Wagtail 管理员的页面创建区域时调用,因此它可用于在适当的情况下自定义该用户通过管理员的路径。如果可能会通过任何其他途径创建页面 - 例如,数据导入或使用多语言网站的翻译工具 - 然后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包含以下内容(或者ready如果您已经有 AppConfig 类,则只需添加/编辑该方法):

from django.apps import AppConfig


class PropertiesConfig(AppConfig):
    name = 'properties'

    def ready(self):
        from . import signals
于 2022-01-26T14:39:05.940 回答