更改网址在

时间:2018-01-02 12:09:13

标签: wagtail

我设置了我的网站,主要的父/树结构为Home > Shop > Category > Product">表示 的父母。

这样可以正常使用,但是当访问Product(Page)时,Wagtail会在/shop/test-category/test-product自动(并且正确)配置网址。

我想更改它,以便产品实际显示为在根级别(即使它不是)。因此,如果用户访问测试产品,它将位于/test-product/

通过文档查看,RoutablePageMixin似乎可以解决问题,但我不知道如何实施它。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

此解决方案将使产品在两个URL上都可用:

  • /shop/test-category/test-product/
  • /test-product/

<强>方法

您是正确的,您需要使用RoutablePageMixin,请务必按照导入前的说明将其安装在installed_apps中。

以下示例将RoutablePageMixin添加到您的HomePage,因为这是位于根/网址的网页。在尾随/之前,我们对单个slug进行正则表达式检查和匹配。

然后我们看看是否可以找到带有该slug的ProductPage,并向该页面提供(或重定向)。最后,如果没有匹配项,我们会使用当前请求调用home_page的serve方法来处理其他任何操作。这可能是错误的网址或正确的子网页网址。

<强>注意事项:

  • 如果您在与产品页面相同的子页面上有子页面,则子页面将永远不会加载,此代码中没有智能可以解决这个问题。如果将来成为问题,您可以在产品名称和子页面名称的验证中加入一些逻辑。
  • 这不考虑SEO问题,搜索引擎会将这些视为不同页面,因此您可能需要考虑在元标记中声明canonical URL
  • 这不会从/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)