LoginSignup
3
2

More than 5 years have passed since last update.

DjangoでWeb Appその②

Posted at

前回はここ

環境

  • macOS High Sierra version 10.13.3
  • Python 3.6.3
  • Django 2.0.1

テーマ

今回のテーマは、「ページを表示する」です。
とにかくページを表示できるようになることが目標。

urls.py

今回の主役1号です。

プロジェクトの方

まずはプロジェクトの方のurls.pyを以下のように変更します。

urls.py
from django.contrib import admin
from django.urls import path, include # includeを追加

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('todo.urls')), # ここも追加
]

これは何をしているかというと、todoアプリのurls.pyを読み込んでねっていうお願いの宣言です。
この辺は本家にもあると思うので、さらっと。

さて、次はアプリの方のurls.pyに行きたいところですが、先にviewを書いちゃいましょう。

Views.py

todo/views.py ですね。
主役2号です。

以下のようにします。

views.py
from django.shortcuts import render

# Create your views here.
# 以下追加部分

def index(request):
    hello = "Hello, World"
    context = {
        'hello': hello,
    }
    return render(request, 'todo/index.html', context)

viewは表示するデータを渡してレンダリングする役割を果たします。
view関数を定義する他、クラスベースビューを使う方法もありますが、それはまた後ほど。

ビュー関数は引数に必ずrequestをとります。ここに渡される内容はHTTPリクエストですね。
レンダリングする方法はいくつかありますが、一番簡単且つ、後々応用が効く方法だと勝手に思っているのが、コンテキストを定義して、リクエストと一緒にrender()関数へ渡しちゃう方法です。

コンテキスト

コンテキストとはテンプレートへデータを渡すためのデータ辞書ですね。(たぶん)
keyの部分には、テンプレート上で使用する文字を、valueの部分には実際に渡すデータを。
ここでは、helloという変数に"Hello, World"という文字列を格納して、それをコンテキストへ渡してます。
つまり、テンプレート上で{{ hello }}とすば、"Hello, World"の文字がレンダリングされるという事です。

render()

render()関数へ渡している引数は順に以下の通りです。

第1引数:request。 HTTPリクエストが渡されている。
第2引数:どのテンプレートを使うかを指定。index.htmlはあとで作ります。
第3引数:コンテキスト。直接辞書を書くことも可能ですが、分かりにくいので、辞書型の変数を渡す派です。

index.html

view関数の定義が完了したので、先ほど指定したテンプレートを用意しましょう。

project/todo/templates/todo/index.html

こんな感じですね。

テンプレートは、djangoが自動的にtemplates以下を探してくれるのですが、アプリが複数になった時、index.htmlとか被りやすい名前の判別に困ってしまうようです。
なので、今はあまり意味のないことですが、todo/temolates/todo/index.htmlという複雑な階層で用意しましょう。

内容

とりあえずindex.htmlの中身ですが、{{ hello }}でいいと思います。
波括弧で囲うのはjinja2の表記ですね。

index.html

{{ hello }}

本当にこれしか書いてません。抜粋ではないです。

またまた、urls.py

最後にアプリ側のurls.pyを書きましょう。

アプリ内にはもともとurls.pyはないので、新たに作る必要があります。
内容はこんな感じ。

urls.py
from django.urls import path
from todo import views

urlpatterns = [
    path('', views.index, name='index')
]

プロジェクトの方のurls.pyと似たようなものですね。
違いといえば、アプリのviewsをインポートしてます。
views.pyの中のindex関数を見てねということでしょうか。

name=indexの部分ですが、これは追い追いテンプレートで役立つので、書いとくと良いです。
まぁ、ちょっと表記が省略できる程度ですが、可読性も上がるし書くべきだと思います。

いざ、runserver

$ python manage.py runserverで開発用のローカルサーバーが立ち上がるので、コマンドを打って、ブラウザで確認しましょう。

こんな感じで表示されれば成功です!
スクリーンショット 2018-02-21 22.57.35.png

まとめ

ポイントは、views.pyでコンテキストをセットして、render()関数へ渡すことと、urls.pyでその関数を指定してあげることだと思います。
この基本の繰り返しで好きなURLから好きなページをレンダリング=表示させることができると思います。

以上です。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2