【发布时间】:2026-02-19 22:00:01
【问题描述】:
我使用 wagtail 制作了一个单页滚动网站。我有一个主页模型,其他所有内容都是子页面,例如关于我们、事件等。在管理页面上,它会创建一个带有子页面标题的 slug,这是实时状态链接使用的。例如它是<a href="/about-us/">。有没有办法改变实时状态链接?
【问题讨论】:
标签: wagtail
我使用 wagtail 制作了一个单页滚动网站。我有一个主页模型,其他所有内容都是子页面,例如关于我们、事件等。在管理页面上,它会创建一个带有子页面标题的 slug,这是实时状态链接使用的。例如它是<a href="/about-us/">。有没有办法改变实时状态链接?
【问题讨论】:
标签: wagtail
页面 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, '/')
【讨论】:
我在使用 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 方法被覆盖,使用request 和get_url_parts 方法来提取请求的relative_page_url(即相对于站点根目录——开发中)那将是http://localhost)。由于我的前端与 Wagtail 站点保持相同的 URL 结构,因此我只需使用提取的 relative_page_url 并将其与前端的主机(在此开发案例中为 localhost:8001)结合并返回重定向响应(使用 django.shortcuts.redirect 生成) ) 到那个完整的 URL。
将这个覆盖转换为混合和设置可能是有意义的,因此不必在每个页面模型上都定义它,并且可以在环境之间区分重定向主机。
您还可以使用覆盖serve() 方法的相同逻辑来重定向到您可能选择的任何其他位置。
【讨论】: