【问题标题】:Change href of Live Status link in Wagtail Admin在 Wagtail Admin 中更改 Live Status 链接的 href
【发布时间】:2026-02-19 22:00:01
【问题描述】:

我使用 wagtail 制作了一个单页滚动网站。我有一个主页模型,其他所有内容都是子页面,例如关于我们、事件等。在管理页面上,它会创建一个带有子页面标题的 slug,这是实时状态链接使用的。例如它是<a href="/about-us/">。有没有办法改变实时状态链接?

【问题讨论】:

    标签: wagtail


    【解决方案1】:

    页面 URL 是通过在页面模型上调用 get_url_parts 方法构建的 - 通过重写此方法,您可以自定义生成的 URL:

    通常,如果您要覆盖get_url_parts,您需要对您网站的 URL 路由行为进行相应的自定义,以确保该页面在相关 URL 处实际可用;这可以通过RoutablePageMixin 完成。但是,在这种情况下,听起来您只是将这些子页面用作页面内容的占位符,并且不会担心它们可以通过自己的 URL 访问 - 因此您可以简单地返回 '/' 作为页面路径:

    class MyChildPage(Page):
        # ...
        def get_url_parts(self, *args, **kwargs):
            url_parts = super(MyChildPage, self).get_url_parts(*args, **kwargs)
    
            if url_parts is None:
                # in this case, the page doesn't have a well-defined URL in the first place -
                # for example, it's been created at the top level of the page tree
                # and hasn't been associated with a site record
                return None
    
            site_id, root_url, page_path = url_parts
    
            # return '/' in place of the real page path
            return (site_id, root_url, '/')
    

    【讨论】:

      【解决方案2】:

      我在使用 Wagtail 作为 Gatsby 网站的无头 CMS 时遇到了这个问题。由于我确实使用 Wagtail 生成的 URL 来构建 Gatsby 站点,因此重新定义 get_url_parts 方法对我没有帮助。在管理员中单击“查看实时”或“实时”按钮时,我确实希望保持页面 URL 不变并使用不同的主机。

      我发现,覆盖您希望由其他主机提供服务的页面的 serve() 方法可以让您做到这一点。

      from django.shortcuts import redirect
      
      class BlogPage(Page):
          ...
          def serve(self, request):
              site_id, site_root, relative_page_url = self.get_url_parts(request)
              return redirect('http://localhost:8001' + relative_page_url)
      

      在上面的代码中,BlogPage 模型的 serve 方法被覆盖,使用requestget_url_parts 方法来提取请求的relative_page_url(即相对于站点根目录——开发中)那将是http://localhost)。由于我的前端与 Wagtail 站点保持相同的 URL 结构,因此我只需使用提取的 relative_page_url 并将其与前端的主机(在此开发案例中为 localhost:8001)结合并返回重定向响应(使用 django.shortcuts.redirect 生成) ) 到那个完整的 URL。

      将这个覆盖转换为混合和设置可能是有意义的,因此不必在每个页面模型上都定义它,并且可以在环境之间区分重定向主机。

      您还可以使用覆盖serve() 方法的相同逻辑来重定向到您可能选择的任何其他位置。

      【讨论】:

        最近更新 更多