单件内容,多个URL?

时间:2017-06-05 16:38:02

标签: wagtail

我有一个用例,我可以使用一些建议。

我们发布了多个产品,每个产品都在网站上拥有自己的子树。通常,一段内容仅发布到单个产品,例如新闻文章发布到产品A,可以在一个URL上访问。

但是,有时我们会将内容发布到多个产品,例如一篇新闻文章发布到产品A,B和C,并将在3个不同的URL上提供。

使用我们当前的CMS,我们最终通过复制和粘贴内容来实现这一点,这对编辑来说很麻烦,特别是如果内容需要更新的话。

一个理想的场景是,编辑器在一个地方编辑内容,指定要发布到的产品,内容由多个URL和特定于产品的模板提供。

似乎RoutablePageMixin在这里很有用,但我不知道如何处理让编辑器指定目标产品并让路由知道该选择。

有人用Wagtail解决了类似的问题吗?

2 个答案:

答案 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的信息,可以查看这个链接。

Routable Page

答案 1 :(得分:0)

不要将您的新闻文章视为一个或多个产品的子对象,而是将它们视为按产品分类的一大类新闻文章。然后,您的产品页面将成为新闻文章的过滤索引页面。

以下是我的模型:

  • 如果您希望您的新闻文章存在于与任何特定类别无关的规范网址中,或者您希望使用网页审核和/或预览,则将NewsArticle定义为网页模型;否则,请将其定义为代码段或ModelAdmin - 托管模型。
  • 在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 %}等标记在产品页面模板中循环播放新闻文章。