Wagtail 在索引页面中呈现任何路径
Wagtail render any path in index page
我需要让一些页面能够写一个不依赖于站点结构的任意URL。
例如我有结构:
/
/blog
/blog/blogpost1
/blog/blogpost2
但是,例如,我需要将 url 从 /blog/blbogpost2
更改为 /some/blogpost/url1
为此,我决定给机会处理网站主页的任何 URL。
class IndexPage(RoutablePageMixin, Page):
...
@route(r'^(?P<path>.*)/$')
def render_page_with_special_path(self, request, path, *args, **kwargs):
pages = Page.objects.not_exact_type(IndexPage).specific()
for page in pages:
if hasattr(page, 'full_path'):
if page.full_path == path:
return page.serve(request)
# some logic
但是现在,如果这个 path
没有找到,但我需要 return 这个请求到标准处理程序。我该怎么做?
RoutablePageMixin
无法做到这一点; Wagtail 将 URL 路由和页面服务视为两个不同的步骤,一旦它确定了负责为页面提供服务的功能(对于 RoutablePageMixin
,这是通过检查中给出的 URL 路由来完成的@route
),无法返回到 URL 路由步骤。
不过,overriding the page's route()
method, which is the low-level mechanism used by RoutablePageMixin
可以做到。你的版本看起来像这样:
from wagtail.core.url_routing import RouteResult
class IndexPage(Page):
def route(self, request, path_components):
# reconstruct the original URL path from the list of path components
path = '/'
if path_components:
path += '/'.join(path_components) + '/'
pages = Page.objects.not_exact_type(IndexPage).specific()
for page in pages:
if hasattr(page, 'full_path'):
if page.full_path == path:
return RouteResult(page)
# no match found, so revert to the default routing mechanism
return super().route(request, path_components)
我需要让一些页面能够写一个不依赖于站点结构的任意URL。
例如我有结构:
/
/blog
/blog/blogpost1
/blog/blogpost2
但是,例如,我需要将 url 从 /blog/blbogpost2
更改为 /some/blogpost/url1
为此,我决定给机会处理网站主页的任何 URL。
class IndexPage(RoutablePageMixin, Page):
...
@route(r'^(?P<path>.*)/$')
def render_page_with_special_path(self, request, path, *args, **kwargs):
pages = Page.objects.not_exact_type(IndexPage).specific()
for page in pages:
if hasattr(page, 'full_path'):
if page.full_path == path:
return page.serve(request)
# some logic
但是现在,如果这个 path
没有找到,但我需要 return 这个请求到标准处理程序。我该怎么做?
RoutablePageMixin
无法做到这一点; Wagtail 将 URL 路由和页面服务视为两个不同的步骤,一旦它确定了负责为页面提供服务的功能(对于 RoutablePageMixin
,这是通过检查中给出的 URL 路由来完成的@route
),无法返回到 URL 路由步骤。
不过,overriding the page's route()
method, which is the low-level mechanism used by RoutablePageMixin
可以做到。你的版本看起来像这样:
from wagtail.core.url_routing import RouteResult
class IndexPage(Page):
def route(self, request, path_components):
# reconstruct the original URL path from the list of path components
path = '/'
if path_components:
path += '/'.join(path_components) + '/'
pages = Page.objects.not_exact_type(IndexPage).specific()
for page in pages:
if hasattr(page, 'full_path'):
if page.full_path == path:
return RouteResult(page)
# no match found, so revert to the default routing mechanism
return super().route(request, path_components)