This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 3 years have passed since last update.

[Day 13]ListViewを使ったリスト表示画面の作成

Last updated at Posted at 2021-01-18

January 18, 2021
←前回:Day 12 管理画面と管理者の作成

「Djangoを学びたい」とのことでありましたら[Day 1]Djangoの開発環境から読むことをおすすめします。

はじめに

クラスベースビューとしては現在までにTemplateViewを見ていきましたが、おそらくその次に初心者の方が使いやすいのがListViewとDetailViewらしいです。
ListViewはリスト表示、DetailViewは詳細表示を作成するのに向いているクラスベースビューです。

準備

今回はトピックの一覧表示をするので管理画面からトピックに関するダミーデータを挿入しましょう。
管理画面のTOPIC画面から「TOPICを追加」を押します。
スクリーンショット 2021-01-18 10.14.29.png
項目を入力していきます。入力したら保存を押せばトピックが出来上がります。一覧表示の練習なので4つぐらい登録しておきましょう。
スクリーンショット 2021-01-18 10.15.20.png

トピック一覧表示の作成

今回はbaseアプリケーションに作成したトップページに新着トピックをリスト表示するページを作成します。theadアプリケーションのモデルをbaseアプリケーションで使うのが気になる方はthread/views.pyでビューを作成してbase/urls.pyもしくはmysite/urls.pyでビューを呼び出してもいいと思います。

まずはテンプレートを以下のように修正します。

templates/base/top.html

{% extends 'base/base.html' %}
{% block title %}ITについて切磋琢磨する掲示板 - {{ block.super }}{% endblock %}
{% block content %}
<div class="ui grid stackable">
    <div class="eleven wide column">
        <div class="ui breadcrumb">
            <a class="active section">TOP</a>
        </div>
        <div class="ui segment">
            <div class="content">
                <div class="header"><h3>新着トピック</h3></div>
                <div class="ui divided items">
                    {% for topic in topic_list %}
                    <div class="item">
                        <div class="content">
                            <div class="header">
                                <a href=""><h4>{{topic.title}}}</h4></a>
                            </div>
                            <div class="meta">
                                <span class="name">{{topic.user_name}}</span>
                                <span class="date">{{topic.created}}</span>
                            </div>
                        </div>
                    </div>
                    {% endfor %}
                </div>
            </div>
        </div>
    </div>
    {% include 'base/sidebar.html' %}
</div>
{% endblock %}

次にbase/views.pyを修正します。

base/views.py

from django.shortcuts import render
from django.views.generic import TemplateView, ListView

from thread.models import Topic

def top(request):
    # template = loader.get_template('base/top.html')
    ctx = {'title': 'IT学習ちゃんねる(仮)'}
    # return HttpResponse(template.render(ctx, request))
    return render(request, 'base/top.html', ctx)

class TopView(TemplateView):
    template_name = 'base/top.html'

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx['title'] = 'IT学習ちゃんねる(仮)'
        return ctx

class TopicListView(ListView):
    template_name = 'base/top.html'
    model = Topic
    context_object_name = 'topic_list'

base/urls.pyも変更しましょう。

base/urls.py

  urlpatterns = [
-     path('', views.TopView.as_view(), name='top'),
+     path('', views.TopicListView.as_view(), name='top'),
      path('terms/', TemplateView.as_view(template_name='base/terms.html'), name='terms'),
  ]

これで一覧表示されました。簡単ですね。
ちなみにcontext_object_name=’topic_list’としましたが、これがなくても問題なく表示されます。
理由はListViewを使用したときのコンテキストで渡すデフォルトの名前が”モデル名_list”だからです。
今回はデフォルトでtopic_listが渡されています。
ただ、この暗黙の命名はDjangoに馴染みのないエンジニアに混乱をもたらしますのでテンプレート側に何を渡しているのかcontext_object_nameで明確に宣言したほうが良いと思います。

さて、この新着スレッドですが、作成日で降順に並べるように変更しましょう。非常に簡単に出来ます。base/views.pyを少し変更するだけです。

base/views.py

  class TopicListView(ListView):
      template_name = 'base/top.html'
-     model = Topic
+     queryset = Topic.objects.order_by('-created')
      context_object_name = 'topic_list'

modelの変わりにquerysetを使用します。ListViewはmodelもしくはquerysetが必須です。get_queryset関数をオーバライドしても良いです。Topic.objectにはBaseManageを継承したクラスであり、一般的にDjangoのデータベースCRUD処理はこのobjectを通して行うことが出来ます。今回はorder_by()関数を用いて作成日の降順に並べました。’created’にマイナス(-)がつくことで降順を表現しています。慣れない内はちょっとギョッと・・しません?

ここでギョッとはしませんでしたが、Djangoは覚えることがたくさんあってかなりギョッとしています。

ブラウザで確認するとこのような画面が見えると思います。
スクリーンショット 2021-01-18 10.54.44.png

自分で保存したものになっているかと思います。

おわりに

今日はListViewの作成をしました。
Djangoって覚えることがたくさんあって大変です、、、
とはいえ、今までのプログラミング学習と同様に「なれなのかな?」と思ったりしています。
Django学習帳では今回のものそうなのですが、遠回りしていそうで近道になることを教えてもらっていると思います。
非常に丁寧でありがたい。

それではまたまた

←前回:Day 12 管理画面と管理者の作成
→次回:Day 14 DetailViewを使った詳細表示画面の作成

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up