我有一个用例,我可以使用一些建议。
我们发布了多个产品,每个产品都在网站上拥有自己的子树。通常,一段内容仅发布到单个产品,例如新闻文章发布到产品A,可以在一个URL上访问。
但是,有时我们会将内容发布到多个产品,例如一篇新闻文章发布到产品A,B和C,并将在3个不同的URL上提供。
使用我们当前的CMS,我们最终通过复制和粘贴内容来实现这一点,这对编辑来说很麻烦,特别是如果内容需要更新的话。
一个理想的场景是,编辑器在一个地方编辑内容,指定要发布到的产品,内容由多个URL和特定于产品的模板提供。
似乎RoutablePageMixin
在这里很有用,但我不知道如何处理让编辑器指定目标产品并让路由知道该选择。
有人用Wagtail解决了类似的问题吗?
答案 0 :(得分:1)
我在Wagtail解决了类似的问题,RoutablePageMixin
是解决这个问题的关键。
如果你有/ blog / A / slug-product /,/ blog / B / slug-product /,/ blog / C / slug-product /,那么你可以在这里得到slug值slug-product
,然后使用此值搜索数据库中的不同内容。
class BlogPage(RoutablePageMixin, Page):
def get_posts(self):
return PostPage.objects.descendant_of(self).live()
@route(r'^(\d{4})/(\d{2})/(\d{2})/(.+)/$')
def post_by_date_slug(self, request, year, month, day, slug, *args, **kwargs):
post_page = self.get_posts().filter(slug=slug).first()
return Page.serve(post_page, request, *args, **kwargs)
正如您所看到的,我没有使用网址的日期信息,而是使用slug值来获取博客帖子对象,您可以按照此处的模式使用正则表达式来匹配您想要的网址。
如果网址中的slug值也不同,此解决方案可能无法正常工作,但在大多数情况下,此解决方案可以正常工作。
我写了一篇博客文章,讨论如何使用RoutablePageMixin使页面可路由,如果你想获得更多关于RoutablePageMixin的信息,可以查看这个链接。
答案 1 :(得分:0)
不要将您的新闻文章视为一个或多个产品的子对象,而是将它们视为按产品分类的一大类新闻文章。然后,您的产品页面将成为新闻文章的过滤索引页面。
以下是我的模型:
在NewsArticle模型上,有一个InlinePanel,编辑可以根据需要关联尽可能多的相关产品:
class NewsArticle(Page):
body = RichTextField()
date = models.DateField()
content_panels = Page.content_panels + [
FieldPanel('body'),
FieldPanel('date'),
InlinePanel('related_products', label="Related products"),
]
class NewsArticleRelatedProduct(Orderable):
news_article = ParentalKey(NewsArticle, related_name='related_products')
product = models.ForeignKey(ProductPage, on_delete=models.CASCADE, related_name='news_articles')
panels = [
PageChooserPanel('product'),
]
在ProductPage模型上,添加一个返回新闻项查询集的方法,对其进行适当筛选和排序:
class ProductPage(Page):
# ...
def get_news_articles(self):
return self.news_articles.live().order_by('-date')
然后,您可以使用{% for news_article in page.get_news_articles %}
等标记在产品页面模板中循环播放新闻文章。