作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想更改博客条目的网址,以包括类别的子条目(@route(r'^([category-slug]/[post-slug]
-例如localost / health / health_blog_1)。
我将如何更改此模型?
class PostPage(RoutablePageMixin, Page):
body = RichTextField(blank=True)
date = models.DateTimeField(verbose_name="Post date", default=datetime.datetime.today)
categories = ParentalManyToManyField('blog.BlogCategory', blank=True)
tags = ClusterTaggableManager(through='blog.BlogPageTag', blank=True)
content_panels = Page.content_panels + [
FieldPanel('body', classname="full"),
FieldPanel('categories', widget=forms.CheckboxSelectMultiple),
FieldPanel('tags'),
]
settings_panels = Page.settings_panels + [
FieldPanel('date'),
]
@property
def blog_page(self):
return self.get_parent().specific
def get_context(self, request, *args, **kwargs):
context = super(PostPage, self).get_context(request, *args, **kwargs)
context['blog_page'] = self.blog_page
return context
最佳答案
将RoutablePageMixin
搁置一会儿,使用Wagtail可以理解的一点是,您不应以与常规Django网站(或Rails或将路线映射到 View / Controller 的任何框架)相同的方式来考虑URL。使用Wagtail,从页面树构建页面的路径。因此,如果您希望类别显示在路径中,则它必须是树的一部分。在您的情况下,将是这样的:
HomePage (title: My Website, path: /)
|- CategoryPage (title: Health, path: /health/)
| |- PostPage (title: Post 1, path: /health/post-1/)
| |- PostPage (title: Post 2, path: /health/post-2/)
| \- PostPage (title: Post 3, path: /health/post-3/)
\- CategoryPage (title: Diet, path: /diet/)
|- ...
\- ...
RoutablePageMixin
的工作原理以及它们可以提供什么。它们允许您创建虚拟页面(树中不存在的页面)。他们通过添加路径后缀来实现此目的,例如您在
BlogIndexPage
上有一个
/blog/
,但您还想在
/blog/archives/<the-year>/
上提供年度存档,并在
/blog/tags/<the-tag>
上提供过滤标签。您可以想到的方式(免责声明:这不是它的实际工作方式)是,当Wagtail收到对
/blog/archives/<the-year>/
的请求时,该路径不会在树中存在(
/blog/archives/
也不会存在),但是
/blog/
确实存在,因此Wagtail会加载重新路由页面并检查与
/archives/<the-year>
匹配的路由(因为它已经解决了
/blog/
)。
RoutablePageMixin
必须是树中父页面声明的一部分。假设
PostPage
es是HomePage的直接子代,如下所示:
HomePage (title: My Website, path: /)
|- PostPage (title: Post 1, path: /health/post-1/)
|- PostPage (title: Post 2, path: /health/post-2/)
\- PostPage (title: Post 3, path: /health/post-3/)
RoutablePageMixin
的声明中包括
HomePage
:
form django.shortcuts import get_object_or_404
from wagtail.contrib.routable_page.models import RoutablePageMixin, route
from wagtail.core.models import Page
class HomePage(RoutablePageMixin, Page):
# Some fields
@route(r'^(?P<category_slug>[\w-]+)/(?P<page_slug>[\w-]+)')
def post_page(self, requets, category_slug, page_slug):
post = get_object_or_404(PostPage, slug=page_slug, category_slug=category_slug)
context = {
'post': post
}
return render(request, 'posts/post_page.html', context)
/<category_slug>/<page_slug>/
(由于RoutablePageMixin)和
/<page_slug>/
(由于其在树中的位置)。您可以忍受,只需设置
canonical URL或将您的帖子重定向到正确的URL:
form django.shortcuts import redirect
from wagtail.core.models import Page
class PostPage(Page):
# Some fields
def serve(self, request, *args, **kwargs):
homepage = self.get_parent().specific
url = homepage.url + homepage.reverse_subpage('post_page', category_slug=self.category_slug, page_slug=self.page_slug)
return redirect(url)
redirect
。这确实使Wagtail违背了其核心原则。
class PostPage(Page):
def serve(..):
....
def get_sitemap_urls(self, request):
"""Overwrite the url."""
return [
{
"location": '', # Reverse subpage url
"lastmod": (self.last_published_at or self.latest_revision_created_at),
}
]
关于django - 使用RoutablePageMixin基于的Wagtail自定义URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54185499/
如果您的所有页面都在树(父/子)中,那么像这样的标准 Wagtail 面包屑系统可以完美运行: {% block main %} {% if self.get_ancestors|length
我是一名优秀的程序员,十分优秀!