我有一个使用页面 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
Hook 对此不起作用,因为它是 one of the last things to run在 Wagtail 管理员的页面创建 View 期间,此时确认消息(包括旧 URL)已经构建完毕。这可以通过使用 post_save
signal 来解决相反,由 Django 提供 - 作为一种更底层的机制,它与保存数据库记录的行为更紧密地联系在一起,而不会妨碍 Wagtail 的管理逻辑。
(它也更加面向 future :Wagtail 的 after_create_page
Hook 被设计为仅在用户浏览 Wagtail 管理的页面创建区域时被调用,以便在适当的情况下可以使用它通过管理员自定义用户的路径。如果有任何其他可以创建页面的途径 - 例如数据导入或使用多语言网站的翻译工具 -那么 after_create_page
将被绕过,但 post_save
信号仍然会被触发。)
假设您的项目有一个 properties
应用程序,您可以在其中定义 PropertyPage 模型,则可以重写您的代码以使用 post_save
,如下所示 - 在 properties/中信号.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
关于python - Wagtail 'View live' 按钮在使用 id 作为 slug 时创建页面后提供错误的 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70515946/