[Django] Generic View の DetailView 内で前後の記事を取得できるようにする
2017-09-25 06:00
  • ひさしぶりに Django のトピックです。
    このサイトのように、ブログっぽい機能を入れていて、 DetailView 内で前後の記事情報を取得したい
    っていうことは結構あると思います。

    たとえば、詳細ページ内で、ひとつ新しい記事や、ひとつ古い記事へのリンクを表示したい場合とか。
    このサイトでもようやく実装しましたのでメモを残しておきます。


    DetailView 内で前後の記事を取得する

    いきなりですが、 view.py を修正します。
    ※以下の例はあくまでもサンプルです

    class BlogDetailView(DetailView):
        model = Blog
        context_object_name = 'blog'
        template_name = 'blog_detail.html'
    
        def get_context_data(self, **kwargs):
            context = super(BlogDetailView, self).get_context_data(**kwargs)
            object_name = super(BlogDetailView, self).get_context_object_name(self)
    
            # すべてのブログ記事を取得する
            # もろもろの条件でフィルタが必要な場合は適宜修正して下さい
            all_articles = Blog.objects.all()
    
            for index, value in enumerate(all_articles):
                if context[object_name].id == value.id:
                    current_index = index
                    newer_index = current_index + 1
                    older_index = current_index - 1
                    break
    
            newer_article = all_articles[newer_index] if current_index < len(all_articles) else ""
            older_article = all_articles[older_index] if current_index > 0 else ""
    
            if prev_article:
                context['newer_article'] = newer_article
            if next_article:
                context['older_article'] = older_article
    
            return context
    
    

    これでタイトル付きで「新しい記事」や「古い記事」へのリンクが貼れるようになります。

    あとはテンプレートをごにょごにょするだけです。

    人気ブログランキングへ ブログランキング・にほんブログ村へ
    ↑応援よろしくお願いします!m(_ _)m

  • 2017-09-25 06:00
  • Python
  • DjangoGenericView前後の記事次の記事前の記事新しい記事古い記事
  • 新しい記事へ
    [WP] WP-CLI を使って WordPress の環境を爆速で構築する

    古い記事へ
    [Mac] git コマンドを叩くと、ライセンスに同意するよう要求されたときの対応方法

profile picture

自己紹介的な何か

@wkmettyでついったーやってます。時々。 普段はなんちゃってプログラマやってます。海外から帰任してからは現場に戻って最前線でコード書いてます。 週末は気の向くままにプログラミングしたり、写真撮りに出かけたり、家でhuluみながらまったりしたりしています。(*´ω`*)モキュ