Django で Template Engine を使用してみる

Python

前回の続きです。

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 のことなのか?と思ってググってみたら、同じことを既に書かれている方がおられました。

Python + Django してみた。 MTV Model について | みむらの手記手帳
どうも書いてて、 MVC っぽいようで、MVC っぽくないので調べてみると、 FAQ 全般 — Django v1_0 documentation ここいはく、 Model – Template – View ということで、 MTV モデルというんだそうな。 MVC モデルでは、 Model : データとデータに対する...

ここに書かれている通り、一般的な 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 が表示されるようにしたので、タイトルがただ列挙されているだけです。改行もありません)

コメント

タイトルとURLをコピーしました