January 18, 2021
←前回:Day 12 管理画面と管理者の作成
「Djangoを学びたい」とのことでありましたら[Day 1]Djangoの開発環境から読むことをおすすめします。
#はじめに
クラスベースビューとしては現在までにTemplateViewを見ていきましたが、おそらくその次に初心者の方が使いやすいのがListViewとDetailViewらしいです。
ListViewはリスト表示、DetailViewは詳細表示を作成するのに向いているクラスベースビューです。
#準備
今回はトピックの一覧表示をするので管理画面からトピックに関するダミーデータを挿入しましょう。
管理画面のTOPIC画面から「TOPICを追加」を押します。
項目を入力していきます。入力したら保存を押せばトピックが出来上がります。一覧表示の練習なので4つぐらい登録しておきましょう。
#トピック一覧表示の作成
今回はbaseアプリケーションに作成したトップページに新着トピックをリスト表示するページを作成します。theadアプリケーションのモデルをbaseアプリケーションで使うのが気になる方はthread/views.pyでビューを作成してbase/urls.pyもしくはmysite/urls.pyでビューを呼び出してもいいと思います。
まずはテンプレートを以下のように修正します。
{% 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を修正します。
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も変更しましょう。
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を少し変更するだけです。
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は覚えることがたくさんあってかなりギョッとしています。
自分で保存したものになっているかと思います。
#おわりに
今日はListViewの作成をしました。
Djangoって覚えることがたくさんあって大変です、、、
とはいえ、今までのプログラミング学習と同様に「なれなのかな?」と思ったりしています。
Django学習帳では今回のものそうなのですが、遠回りしていそうで近道になることを教えてもらっていると思います。
非常に丁寧でありがたい。
それではまたまた