概要Djangoで、ブログを作るシリーズ2の一つです。記事一覧を作っていきます。記事一覧ビューの作成まずは、シンプルな記事一覧機能から作りましょう。name='note_list'),views.pyに、次のようなビューを作ります。Note本当にシンプルなListViewです。説明は要らないと思われます。テンプレートファイルを作りましょう。note_list.htmlです。class="box">検索結果はありませんでした。%}して使っているnaturaltimeは、日付型のデータを渡すと「〇時間前」といった人にやさしい表現で返してくれるフィルタです。Djangoに付属しているアプリケーションで、これを利用するにはsettings.pyのINSTALLED_APPSにdjango.contrib.humanizeという記述を足しておきましょう。style.cssに記事一覧に関するスタイルを追記します。1em;}ここまでで、次のような見た目になります。次に、検索機能を実装します。forms.pyを作ります。f'全カテゴリ({all_note_count})'よくある検索フォームなのですが、カテゴリフィールドは少しややこしいことになっています。widget=forms.RadioSelect,は、デフォルトのselect要素ではなく、ラジオボタンに変更しています。見た目的に、今回はラジオボタン形式を使いたかったので。queryset=Category.objects.annotate(note_count=Count('note')).order_by('name'),は何かというと、各カテゴリモデルインスタンスに、note_countという属性名で、紐づく記事数が設定されるようになります。イラスト(10)みたいに表示するための処理です。これは後程、説明します。__init__メソッドでやっているのは、デフォルトで作られる「----------」といった空を表す選択肢...empty_labelですが、これを書き換えて、「全てのカテゴリ(100)」みたいに表示しています。数字部分は、全ての公開記事の数です。models.pyのCategoryモデル、__str__メソッドを次のように変更します。self.nameフォーム内の選択肢ですが、モデルの__str__が呼ばれます。フォームの選択肢をイラスト(10)みたいな表示にしたい場合は、ここも編集する必要があります。note_countという属性がある場合、つまりフォーム側から呼ばれた選択肢の作成処理の場合は、イラスト(10)といった文字列を返すようにしておきます。views.pyです。先ほど作ったフォームを使うようにしましょう。contextget_querysetメソッドで、フォームの入力内容をもとに、絞り込んでいます。この際にself.formといった属性にフォームオブジェクトを設定しています。self.formといった書き方ができます。None)といった書き方をしなくてはならなくて、無駄な処理が増えます。get_querysetが先に呼ばれるので、問題が起きたりもしません。post_list.htmlに、aside要素部分を追加します。</section>の後に追加しましょう。%}style.cssに、フォーム関連のスタイルを追記します。ease-out;}見出し部分を動的にする「全てのノート」という部分ですが、ここは検索した内容で動的にしようと思います。「Webデザイン」のカテゴリをチェックして検索したら「Webデザインの検索結果」みたいに表示させようと思います。contextget_context_dayaメソッドの中で、「全てのノート」とか「〇〇の検索結果」みたいな文字列を作っています。...みたいに、属性に設定したりもしています。note_list.htmlを少し変更します。記事を一度に12件ずつ表示するようにしましょう。'-created_at'ListViewでは、これだけでページング処理をしてくれます。今回は検索フォームが既にあります。Django、ページング処理まとめでも解説していますが、他のGETパラメータあがる場合は、ページング処理が少し面倒になります。アプリケーション内にtemplatetagsパッケージを作り、中にnblog2.pyを作ります。中身は次のようにしておきます。"""GETパラメータの一部を置き換える。url_dict.urlencode()そして、これを使ってページネーションのHTMLを作ります。note_list.htmlに追記しましょう。3行目と、</section>の手前にコードを追加します。</section>style.cssにも、追記します。#333;}非公開記事一覧ビューの作成まず、urls.pyに追加します。name='private_note_list'),そして、is_publicがFalseな記事だけ表示するビューを作りましょう。TrueNoteListビューを継承して、殆どの処理を引き継ぎます。queryset属性だけ上書きして、非公開記事を取得するように変更します。非公開記事なので、LoginRequiredMixinを使い、ログインしないと非公開記事一覧は見れないようにしています。Trueなので、非公開記事一覧ページにアクセスしたけど、ログインしていない場合は403ページに直行します。ちなみにデフォルトはFalseで、403ではなくログインページにリダイレクトします。ログインページの存在そのものを隠したいという場合は、今回のようにTrueにしておくと良いでしょう。これで/privateにアクセスすると、非公開記事一覧ページが表示されるようになります。今回はやりませんでしたが、ログインしている場合はページ上部にでも、非公開記事一覧ページへのリンクを表示する、等も良いでしょう。PostsDjangoで、ブログを作るシリーズ2Djangoでブログを作っていくシリーズです。シリーズ・まとめComment記事にコメントするまだコメントはありません。幾つかの方法で、ブログの更新を受け取れます。