在Wagtail Admin中更改Live Status链接的href

时间:2018-01-26 19:45:42

标签: wagtail

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

2 个答案:

答案 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方法被重写为使用requestget_url_parts方法来提取请求的relative_page_url(这是相对的到网站根目录-在开发中将为http://localhost)。由于前端保持与Wagtail网站相同的URL结构,因此我只使用提取的relative_page_url并将其与前端主机(在此开发案例中为localhost:8001)结合起来并返回重定向响应(生成与django.shortcuts.redirect一起访问该完整网址。

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

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