安心・健康・痩せる方法

アンヘルシープログラマーの備忘録

Django入門その後に(8)〜TとVを追加してとにかく動かす〜

ここから先は少し複雑で、いくつかのことを同時に直さないと動かすことができません。
まずはやることを図示します。

urlにアクセスしたとき
f:id:darakunomiti:20170506181417j:plain

最初のMTVモデルではurlについて説明をはしょりましたが、実際にはurlがcontrollという役割を担います。
MTVのViewの前にどのViewを呼ぶかを振り分ける、コントロールという処理があるんですですね。

流れとしては、①プロジェクトのurls.py→②アプリケーションのurls.py→③アプリケーションのViews.pyの指定したメソッド→④取得したデータをtemplateに詰めて返す

処理の順番に従うと①から書くのが良いと思うのですが、①を書くためには呼び出す②が必要で、②を書くには③が・・となるので④番のtemplateから書いていこうと思います。

最終的に何を表示したいか

最終的には先ほど登録したゆきよ様の名前を1行表示します。

④template置き場を作ろう

templateの置き場はまぁ諸説ありますが、seiyuu_info/info/template/に置こうと思います。

  • seiyuu_info/info/直下にtemplatesフォルダを追加します。
  • その中にlist.htmlを追加します。
  • htmlを以下のように修正します。
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>ゆきよ様</title>
</head>
<body>
<p>{{seiyuu.name}}</p>
</body>
</html>

ここでは{{seiyuu.name}}にデータベースから読み出した声優さんのお名前を表示します。{{ }} 二重の中括弧に括られた中にデータベースから取得したお名前を表示します。
なお、筆者はwebapiばかり作っているhtmlど素人なので、自分の勉強もかねて素のhtmlで行こうと思います。

③Viewを追加しよう

次にView(処理)を書きましょう。

seiyuu_info/views.py
from django.shortcuts import render  # レスポンス用の関数
from info.models import Seiyuu  # データベースを使えるようにする 

# Create your views here.


def get_yukiyo(request):
    """ゆきよ様のデータを返す"""

    seiyuu = Seiyuu.objects.get(name='藤井ゆきよ')  # 声優さんTBLからゆきよ様のデータだけ取得します。
    return render(request,
                  'seiyuu_list.html',  # 使用するテンプレート
                  {'seiyuu': seiyuu})  # テンプレートに渡すデータ

seiyuu = Seiyuu.objects.get(name=‘藤井ゆきよ’)

ここでは名前が'藤井ゆきよ'であるようなレコードをselectしています。
テーブル名.objects.get(条件)とすることで、Seiyuuテーブルの中身を一件だけselectできますが複数件(または0件)来た場合はエラーとなります。
条件の書き方も色々ありますが、今回は field名=‘条件文'という書き方にしました。
ここは感覚的に分かるかなと思います。

レコードを取得したら、次にrequestデータを受け取って、レスポンスデータを返します。
テンプレートは先ほど作成したseiyuu_list.htmlです。
seiyuu_list.htmlでは{{seiyuu.name}}を表示ししようとしていますので、seiyuuというレコードをそのまま渡します。

viewを呼ぶとtemplateにデータを詰めて返すところはできました。
しかし、まだurlにこの処理がどのurlから呼ばれるか書いていないので追加しましょう。

②アプリケーションのurlからlistを呼ぶ処理を書く

アプリケーションinfoでurlとviewを繋げます。
seiyuu_info/info/urls.pyを追加する

``from django.conf.urls import url from info.views import get_yukiyo # ゆきよ様のデータを呼び出す関数を追加

urlpatterns = [ url(r'^get_yukiyo/$‘, get_yukiyo), # http://XXX/info/list にアクセスされたらseiyuu_listの関数を呼び出す ]```

①プロジェクトのurlsからアプリケーションinfoを呼ぶ

webプロジェクト全体とinfoプロジェクトを繋げます。
ここについても、開くと英語でなにか書かれていると思いますが、あそこを参考にすれば大丈夫です。

from django.conf.urls import url, include # includeの追加
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^info/', include('info.urls')) # 先ほど追加したinfo.urlをinclude(良い翻訳が浮かばない)する
]```

include('info.urls')についてですが、この書き方をすることで、 info/urls.pyに書かれた全てのurlを取り込むことができます。(今回はyukiyoしかありませんが・・)</br> 

この時点で以下のアドレスにアクセスするとお名前が表示されていると思います。

[http://127.0.0.1:8000/info/yukiyo/:title]


まずはこれで最低限の疎通ができました。
これ以降はMVTのそれぞれに絞って細かく見ていこうと思います。