2017-06-05 1 views
0

私はいくつかのアドバイスを利用できるユースケースを持っています。1つのコンテンツ、複数のURL?

複数の製品を公開しています。それぞれの製品には、サイトに独自のサブツリーがあります。一般に、コンテンツは1つの商品にのみ公開されます(例:ニュース記事は製品Aに公開され、1つのURLからアクセスできます。

ただし、複数の商品に公開するコンテンツがあることがあります。 1つのニュース記事がA、B、Cの商品に公開され、3つの異なるURLで利用できるようになります。

私たちの現在のCMSでは、コンテンツをコピーして貼り付けることでこれをやっています。これは、特にコンテンツを更新する必要がある場合には、編集者の手間です。

エディタがコンテンツを1か所で編集し、公開する製品を指定し、コンテンツが複数のURLと製品固有のテンプレートによって提供される場合が理想的です。

ここではRoutablePageMixinが役に立つと思われますが、エディタに宛先製品を指定させ、その選択肢をルーティングに認識させる方法についてはわかりません。

誰もWagtailを使用して同様の問題を解決しましたか?

答えて

0

あなたのニュース記事を1つまたは複数の製品の子オブジェクトとして考えるのではなく、それらをニュース記事の1つの大きなプールとして製品別に分類することが役立ちます。あなたの製品ページは事実上、ニュース記事のフィルタリングされたインデックスページになります。ここで

は、私はそれをモデル化したい方法は次のとおりです。

  • あなたのニュース記事は、任意の特定のカテゴリの独立したのです正規のURLに存在する場合、または、ページの節度及び/またはプレビューを利用したい場合NewsArticleをページモデルとして定義します。それ以外の場合は、スニペットまたはModelAdmin管理対象モデルとして定義します。 NewsArticleモデルに
  • 、必要に応じて編集者は、できるだけ多くの関連製品を関連付けることができInlinePanel持っている:ニュース項目のクエリセットを返すメソッドを追加し、あなたのProductPageモデルに

    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'), 
        ] 
    
  • を、濾過し、ソート適切:

    class ProductPage(Page): 
        # ... 
        def get_news_articles(self): 
         return self.news_articles.live().order_by('-date') 
    

製品のページテンプレートでニュース記事の上にあなたがすることができ、ループ、{% for news_article in page.get_news_articles %}のようなタグを使用しました。

+0

私は逆の考え方が好き、に考えるように私にいくつかのアイデアを提供します。マインドシフトに感謝します! –

0

私はWagtailで同様の問題を解決しましたが、RoutablePageMixinがこの問題を解決する鍵です。

/blog/A/slug-product /、/ blog/B/slug-product /、/ blog/C/slug-product /の場合、ここでスラッグ値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) 

あなたが見ることができるように、私はあなたが欲しいURLと一致する正規表現を使用するには、ここのパターンに従うことができ、ブログ記事のオブジェクトを取得するには、URLの日付情報が、スラグ値を使用していませんでした。

URLのスラッグ値も異なる場合、この解決策はうまくいかないかもしれませんが、ほとんどの場合、この解決策はうまくいく可能性があります。

RoutablePageMixinを使用してページをルーティング可能にする方法について説明したブログ記事を書いています.RoutablePageMixinについて詳しく知りたい場合は、このリンクをチェックしてください。

Routable Page

+2

あなた自身の商品/ブログを宣伝したい場合は**あなたの所属を開示する必要があります**。そうしないと、回答が迷惑メールとして表示されることがあります。 [スパマーにならない方法](https://stackoverflow.com/help/promotion)をお読みください。 – DavidPostill

関連する問題