我使用wagtail创建了一个单页滚动网站。我有一个主页模型,其他一切都是子页面,如关于我们,事件等。在管理页面上,它创建一个slug,其中包含子页面的标题,这是实时状态链接使用的。例如,它是<a href="/about-us/">
。有没有办法改变实时状态链接?
答案 0 :(得分:1)
通过调用页面模型上的get_url_parts
方法构建页面URL - 通过重写此方法,您可以自定义生成的URL:
通常情况下,如果您要覆盖get_url_parts
,则需要对网站的网址路由行为进行相应的自定义,以确保该网页在相关网址上实际可用;这可以通过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, '/')
答案 1 :(得分:0)
在使用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
一起访问该完整网址。
将此替代转换为混合和设置很有意义,因此不必在每个页面模型上都定义它,并且可以在不同环境之间区分重定向主机。
您还可以使用覆盖serve()
方法的相同逻辑来重定向到您选择的任何其他位置。