这是实现此解决方案的更具体的 Wagtail 方法,它假设您还有一个包含所有博客页面的 BlogIndexPage。尽管即使您的 BlogPages 存在于 HomePage 下也可以使用,但只需相应地移动您的路由方法。
概述:
- 我们将更新 BlogPageIndex(或您的博客页面所在的任何页面)上的子 URL。我们通过添加 mixin RoutablePageMixin来做到这一点。
- 然后,我们可以将
@route
BlogPageIndex 上的方法用作我们想要的任何类型的自定义视图的装饰器。
- 最后,我们需要更新我们的 BlogPage 模型,使其正常的 URL 将遵循我们的新 URL 映射。我们通过覆盖
set_url_path
BlogPage 上的 来做到这一点。
- 这将使用
slug
BlogPage 模型中的普通字段和date_published
生成新的url_path
.
参见示例 /myapp/models.py
from django.shortcuts import get_object_or_404
from wagtail.contrib.routable_page.models import RoutablePageMixin, route
from wagtail.wagtailcore.models import Page
class BlogPage(Page):
# using date_published instead of date to reduce ambiguity
date_published = models.DateField(
"Date post published", blank=True, null=True
)
# ...other fields: main_image, intro, body
# ...search_fields
# ...content_panels
# override the set_url_path method to use generate different URL
# this is updated on save so each page will need to be re-published
# old URL will still work
def set_url_path(self, parent):
# initially set the attribute self.url_path using the normal operation
super().set_url_path(parent=parent)
self.url_path = self.url_path.replace(
self.slug, '{:%Y/%m/%d/}'.format(self.date_published) + self.slug
)
class BlogIndexPage(RoutablePageMixin, Page):
# note - must inherit RoutablePageMixin AND Page
# ...other fields
# ...search_fields
# ...content_panels
# route for sub-pages with a date specific URL for posts
# this will NOT make a list of pages at blog/2018 just specific blogs only
@route(r'^(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/(?P<slug>[\w-]+)/?$')
def blog_page_by_date(self, request, year, month, day, slug, name='blog-by-date'):
"""Serve a single blog page at URL (eg. .../2018/01/23/my-title/)"""
blog_page = get_object_or_404(
BlogPage,
date_published__year=year,
date_published__month=month,
date_published__day=day,
slug=slug
)
return blog_page.serve(request)
# Speficies that only BlogPage objects can live under this index page
subpage_types = ['BlogPage']
注意事项:
- 每个现有的博客页面都需要重新保存以触发对 url_path 的更新。
- 原来的 url_path 仍然可以工作并且不会重定向,可以通过覆盖该
serve
方法并检查是否使用旧 URL 来添加重定向,然后重定向。
- 这不考虑具有多个页面 URL 的任何 SEO 影响。