前のパートに戻る 完了して次のパートへ  

  2-3 仮のトップページの作成

いよいよ、トップページを作成していきます。

本パートの目標


下記の画像のように、簡易的な仮のトップページを表示させるのが本パートの目標です。

トップページ作成までの流れ


以下の流れでトップページを実装していきます。

  1. トップページのビューの作成
  2. kanbanアプリのルーティングの設定
  3. プロジェクト全体のルーティングの設定
  4. トップページのテンプレートの作成

1. トップページのビューの作成


最初に、ビューを作成します。 kanban/views.py を開いて、下記のコードを追記してください。

from django.shortcuts import render

# 以下を追記
from django.http import HttpResponse


def index(request):
    return HttpResponse("仮のトップページ")

ここでは index というビューを定義し、テンプレートを指定せずに素の文字列 "仮のトップページ" をレスポンスとして返すようにしています。 文字列をレスポンスとして返すときは HttpResponse を呼び出して、ビューの返り値に設定します。

2. kanbanアプリのルーティングの設定


次にkanbanアプリのルーティングを設定します。

アプリのルーティング設定に関するファイルは自動で生成されないので、手動で空のファイルを作成します。kanban/urls.py を作成して、下記のコードを追記してください。

from django.urls import path

from . import views

app_name = "kanban"

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

app_name にはアプリ名を指定します。app_name を設定することで、プロジェクトを通してグローバルにこのアプリケーションのURLを特定できるようになります。

urlpatterns というリストに path() 関数を格納します。 path() 関数は route , view , name , kwargs の4つの引数を受け取ります。 そのうち routeview の2つは必須の引数で、他の2つは省略可能な引数です。

route はURLパターンの文字列です。Djangoはリクエストとして受け取ったURLと、routeとして設定された文字列をリストの上から順に比較し、一致するものを特定します。(厳密にはドメイン以下を比較します) 例えばドメインを https://www.example.com/ とすると、今指定したパターンは ''(空の文字列) なので https://www.example.com/ そのものが特定されます。 https://www.example.com/usershttps://www.example.com/home は除外されます。

view はビュー関数を指定します。 route で指定したURLパターンで特定されたリクエストは view で指定したビューに渡されます。

name に文字列を指定することで、URLの名称の定義が可能です。これにより、Djangoのあらゆる場所から参照することが可能となります。

kwargs は追加の引数を辞書としてビューに渡すことができます。

ここでは routeview name を指定しています。 特段凝ったことをしない場合は kwargs を指定することはほとんどないと思ってよいでしょう。

3. プロジェクト全体のルーティングの設定


kanbanアプリのルーティング設定ができたので、次はプロジェクト全体のルーティングを設定します。config/urls.py を開いて、下記のコードを追記してください。1-15行で英文のコメントが入っていると思いますが、こちらは無視してもらってかまいません。

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

urlpatterns = [
    path("kanban/", include("kanban.urls")), # この行を追加
    path('admin/', admin.site.urls),
]

importするモジュールにincludeを追加することと、追加した行の末尾に , を書き忘れないように注意してください。

ここで行っていることは先ほどの「2. kanbanアプリのルーティングの設定」と同じです。 唯一、第二引数にビュー関数ではなく include() を指定している点が異なります。 include() を指定することで、URLパターンを入れ子にして定義することができます。 つまり、先ほどの例でいうところの https://www.example.com/kanban/ 以下に「2. kanbanアプリのルーティングの設定」が適用されます。 この場合 https://www.example.com/kanban/ が仮のトップページへのビュー関数に割り当てられることになります。

このように、柔軟にURLパターンを定義することが可能となっています。

仮のトップページを表示してみる

いまの説明だけだと感覚を掴むのが難しいかもしれません。 ここまで実装することで、テンプレートを使わない仮のトップページを表示させることができるようになったので、表示させてみましょう!

サーバーを停止している方は、再度起動しましょう。

<code>$ pipenv run python manage.py runserver</code>

そして http://127.0.0.1:8000/kanban/ にアクセスしてみましょう。 下図のように「仮のトップページ」と表示されたら正しく動作しています!

ここで表示される文字列は kanban/views.pyHttpResponse() で指定した文字列と連動しています。HttpResponse() の文字列を好きな文字列に変えてみましょう。ページをリロードすると文字列が変わって表示されるのが確かめられると思います。

また、1章では http://127.0.0.1:8000/ にアクセスすると、ロケットの画面が表示されたかと思いますが、ここでは404エラーが表示されるかと思います。

これは、http://127.0.0.1:8000/ というURLそのものに対して、urls.pyで設定を行っていないため、 Page not Found と表示されています。

4. トップページのテンプレートの作成


さて、最後にテンプレートを使ってレスポンスを返すように処理を変更しましょう。

templateディレクトリと空のテンプレートの作成

「2-2 Djangoアプリの作成」で触れましたが、アプリを作成した時点ではテンプレートに関するファイルやディレクトリは自動で生成されません。 そのため、テンプレートファイルを格納するディレクトリを作成する必要があります。

kanban ディレクトリ内に templates ディレクトリを作成してください。 さらに templates 内に kanban ディレクトリを作成してください。 今作成した kanban ディレクトリに、空の index.html ファイルを作成してください。これがテンプレートとなります。

ちょっと複雑ですね。アプリ内はこのようなディレクトリ構成になると思います。

kanban
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│   └── __init__.py
├── models.py
├── templates
│   └── kanban
│       └── index.html
├── tests.py
├── urls.py
└── views.py

なぜ templates 内に再度 kanban ディレクトリを作成しているかというと、他のアプリとの競合(同じファイル名のものが被ってしまうこと)を防ぐためです。

テンプレートの作成

先ほど作成した index.html を、以下のように編集しましょう。

pタグで囲んだだけの簡易的なhtmlファイルです。


ビューにテンプレートを指定

作成したテンプレートをビューで指定します。

kanban/views.py を開いて、下記のように編集してください。

from django.shortcuts import render
# HttpResponseのimport文は削除して構わない

def index(request):
    return render(request, "kanban/index.html") # このように変更する

render(request, template_name, context) とは、テンプレートに値(変数)を埋め込んだ結果をHttpResponseに変換する関数です。ここでは第三引数の context を省略して、テンプレートに値を埋め込むような動作はさせていませんが、テンプレートを読み込んでHttpResponseに変換しています。 つまり、 render() の返り値と HttpResponse() の返り値は同じ型となります。

一般的に、Webアプリケーションを実装する際は、テンプレートファイルを元にHTMLファイルを生成して、それをレスポンスとして返すことがほとんどであるため render() を使うことが多いでしょう。

これでテンプレートを使った仮のトップページの作成が完了です! http://127.0.0.1:8000/kanban/ にアクセスして、動作を確認しましょう。 下図のように表示されていれば正しく動作しています。

以上で仮のトップページの作成が完了です。 お疲れ様でした🎉

議論

0 質問

このコースの評価は?