ようやくデータベースにサンプルのデータが登録できたので,このデータを取得してコメント一覧として表示してみよう.Laravel のようにコントローラでSQLに近いコマンドを入力してデータを取り出して,それを表示する方法も可能であるが,Django にはモデル名を指定するだけで一覧を取得できるような機能があるので,それを利用してみよう.
まず,comments/views.py で django.views.generic
から ListView
と Comment
モデルをインポートする.またこれまであった index
関数を削除するかコメントアウトし,CommentIndexView
クラスを定義する.また不要になったインポート文もコメントアウトするか削除する.よって,必要であるのは 3, 4 行目と 11, 12 行目だけである.
comments/views.py
# from django.shortcuts import render
# from django.http import HttpResponse
from django.views.generic import ListView
from .models import Comment
# Create your views here.
# def index(request):
# return HttpResponse("Hello, world. You're at the comments index.")
class CommentIndexView(ListView):
model = Comment
これだけで,コメント一覧が取得できており,object_list
や モデル名_list
で(今回の場合は comment_list
で)HTML ファイルからアクセスできる.また,ListView を使用した場合は,対応する HTML ファイルが モデル名_list.html
となるので,comment_list.html
ファイルを comments/templates/comments フォルダを作成してこの中に設置する.
comments/templates/comments/comment_list.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>コメント一覧</title>
</head>
<body>
{% block content %}
<h1>コメント一覧</h1>
<ul>
{% for comment in object_list %}
<li>
{{ comment.title }} : {{ comment.body }}
</li>
{% endfor %}
</ul>
{% endblock content %}
</body>
</html>
なお,上の11行目で object_list
は comment_list
でも動作する.
最後に urls.py を次にように変更する.5行目でアプリケーションの名称を設定し,7行目では views.py で定義したクラス名を指定する.なお,urls.pyにおいて views のインポート方法と書き方にいくつかの方法がある.これについてはのちのステップ「urls.pyの書き方」で説明する.
comments/urls.py
from django.urls import path
from . import views
app_name = 'comments'
urlpatterns = [
path('', views.CommentIndexView.as_view(), name='index'),
]
ここまでできれば,Web サーバを起動して,トップページにアクセスしてみよう.データベースからすべての内容が取得できているはずである.
なお,表示された(生成された) Web ページについて,3件目のコメントの部分を確認すると HTML タグ文字 < や > が < や > にエスケープされていることも確認できる.すなわち,もしも悪意を持った利用者が HTML タグや JavaScript などを投稿したとしても,それが実行されることがなく安全であることを意味している.