前回の続きです。
https://coffee-nominagara.com/django-client-to-db
ほぼ udemy 「【3日でできる】はじめての Django 入門」の内容の備忘録になります。
今回やること
動的にテンプレートファイル(html)を作ってみます。
やり方としては、Template Engine というものを使います。
Template Engine を使うことで、モデル(DB)からデータを取り出し、それをテンプレートファイルに渡してやることで、データを反映した html ファイルを生成することができます。
Template Engine の種類としては、Django純正のものと Jinja2 というものが有名らしいです。
モデルからデータを取り出し、テンプレートファイルに渡す
View(posts\views.py
)にて、モデルからデータを取り出して、テンプレートファイルに変数としてデータを渡すという処理を加えます。
# posts\views.py
from django.shortcuts import render
from django.http import HttpResponse
from .models import Post
# index というページを意味する関数
def index(request):
# objects オブジェクト内のですべてのデータを取得ということになる。- をつけることで 'published' という属性の降順となる
posts = Post.objects.order_by('-published')
# {'テンプレ(htmlファイル)内での変数名': 渡す変数名}
# つまり、'posts/index.html' に posts 変数を渡すということ
return render(request, 'posts/index.html', {'posts': posts})
基本的には上記ソースのコメントに書いてある通りですが、ちょっと気になる点としては、Post.objects
というものが、Post テーブルからデータを全て取り出すということをしているように見えます。
ちょっとグローバル変数的に簡単にアクセスできることに違和感がありますが・・・まぁこういうものなんでしょうね。
補足:MTV パターンについて
ここまでやっていて、個人的にはビューがモデルに依存するので違和感がありました。
ここでいう「ビュー」とは MVC でいう Controller のことなのか?と思ってググってみたら、同じことを既に書かれている方がおられました。
ここに書かれている通り、一般的な MVC に対して、Django では MTV という構成になっているようです。
MTV とは、「M:Model」「T:Template」「V:View」で、
MVC でいう「M:Model」「V:View」「C:Controller」にそのまま対応しているとのことです。
つまり、Django でいう View とは MVC でいう Controller に該当するということです。
ちょっとややこしいですね。
テンプレートファイルで Template Engine の処理をする
以下のように posts\templates\posts\index.html
を修正します。
<!DOCTYPE html>
<html lang = "ja-jp">
<haed>
<title>THIS IS TITLE</title>
</haed>
<body>
<h1>Hello World!!これは本文です</h1>
<h2>最新の投稿</h2>
<!--Django のテンプレート-->
{% for post in posts.all %}
{{ post.title }}
<br/>
{{ post.published }}
<br/>
{{ post.body }}
<br/>
{% endfor %}
</body>
</html>
{%
と %}
で括っている部分が Template Engine を使用してビューから渡された変数を使って処理するところです。
ここでは posts
変数(ビューから渡された際は、レコードが published 属性で降順にソートされている配列)に格納されたデータを for 文で一つずつ取り出して表示するということをしています。
また、{{
と }}
で括っているところで、変数を参照することができるようです。
確認
ここまでで http://127.0.0.1:8000/posts/ にアクセスすると以下のようになります。
画面に、Post テーブルに保存していたデータが表示されています。
(前回、オブジェクトを文字列で表示させる(str
関数)と title が表示されるようにしたので、タイトルがただ列挙されているだけです。改行もありません)
コメント