我设置了我的网站,主要的父/树结构为Home > Shop > Category > Product"
,>
表示 的父母。
这样可以正常使用,但是当访问Product(Page)
时,Wagtail会在/shop/test-category/test-product
自动(并且正确)配置网址。
我想更改它,以便产品实际显示为在根级别(即使它不是)。因此,如果用户访问测试产品,它将位于/test-product/
。
通过文档查看,RoutablePageMixin
似乎可以解决问题,但我不知道如何实施它。有什么想法吗?
答案 0 :(得分:2)
此解决方案将使产品在两个URL上都可用:
/shop/test-category/test-product/
/test-product/
<强>方法强>
您是正确的,您需要使用RoutablePageMixin
,请务必按照导入前的说明将其安装在installed_apps中。
以下示例将RoutablePageMixin
添加到您的HomePage
,因为这是位于根/
网址的网页。在尾随/
之前,我们对单个slug进行正则表达式检查和匹配。
然后我们看看是否可以找到带有该slug的ProductPage
,并向该页面提供(或重定向)。最后,如果没有匹配项,我们会使用当前请求调用home_page的serve
方法来处理其他任何操作。这可能是错误的网址或正确的子网页网址。
<强>注意事项:强>
/shop/test-category/test-product/
重定向回/test-product/
- 可以通过覆盖serve
上的ProductPage
方法并重定向到home_page.url + '/' + self.slug
之类的方法来完成}。示例代码:
# models.py - assuming all your models are in one file
from django.db import models
from django.shortcuts import redirect # only needed if redirecting
from wagtail.admin.edit_handlers import FieldPanel
from wagtail.contrib.wagtailroutablepage.models import RoutablePageMixin, route
from wagtail.core.models import Page
class ProductPage(Page):
price = models.DecimalField(max_digits=5, decimal_places=2)
content_panels = Page.content_panels + [
FieldPanel('price')
]
class HomePage(RoutablePageMixin, Page):
@route(r'^(?P<product_slug>[\w-]+)/$')
def default_view(self, request, product_slug=None):
"""Route will match any `my-product-slug/` after homepage route."""
product_page = Page.objects.exact_type(ProductPage).filter(slug=product_slug).first()
if product_page:
# option 1 - redirect to the product's normal URL (non-permanent redirect)
# return redirect(product_page.specific.url)
# option 2 - render the product page at this URL (no redirect)
return product_page.specific.serve(request)
else:
# process to normal handling of request so correct sub-pages work
return self.serve(request)