モデルをHTMLに表示する
データを作成したところで、DBからデータを取得しHTMLに表示する処理を作成します。
URLディスパッチャ、テンプレート、ビュー関数の関連
モデルを作成したところで、作成したモデルをHTMLに表示する機能を実装します。URLディスパッチャ、ビュー関数、テンプレートシステムの関係を図6に示しました。
図中に記載されている設定ファイルの記述、ソースコードについては順に説明していきます。
テンプレートの作成
まずは、モデルを表示するためのテンプレートを作成します。
settings.pyの編集
テンプレートファイルはDjangoのディレクトリ構造と切り離して設定することができます。「settings.py」ファイルのTEMPLATE_DIRS
パラメータに、テンプレートを配置するルートフォルダを指定します。この値はカンマ区切りで複数指定することができます。ここでは「C:/codezine/django/templates」をテンプレート用のルートフォルダとして設定します。
TEMPLATE_DIRS = ( 'C:/codezine/django/templates', )
テンプレートファイルの作成
次に、テンプレートファイルを作成します。ファイルはsettings.pyのTEMPLATE_DIRS
パラメータに指定した「C:/codezine/django/templates」の下にさらにpageフォルダを作成し「item.html」というファイル名(フルパス「C:/codezine/django/templates/page/item.html」)で作成します。ファイルの中身は次のとおりです。商品コード(item_code)、商品名(item_name)、価格(price)を表示するだけの簡単なページです。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>{{ item.item_name }}</title> <head> <body> <center> 商品コード:{{ item.item_code }}<br> 商品名:{{ item.item_name }}<br> 価格:{{ item.price }}円<br> <br> <input type="submit" value="買い物かごに入れる"> </center> </body> </html>
テンプレートファイル内の「{{ item.item_name }}」と二重の中カッコになっている箇所に注目してください。ここはテンプレートがビュー関数で動的に変換される場所になります。ここでは商品コード、商品名、価格が表示時に動的に変換されます。
URLディスパッチャの定義
URLによるビュー関数のディスパッチを定義するには、プロジェクトフォルダ「c:¥codezine¥ecsite」の「urls.py」を編集します。
urlpatterns = patterns('', (r'^item/(?P<item_id>\d+)/$', 'ecsite.itempage.views.item_page_display'), )
urlpatterns
変数内のpatterns
関数の第1引数に正規表現でパスを定義し、第2引数に対応するビュー関数の名前を指定します。「r'^item/(?P<item_id>\d+)/$'」は、「item/数字/行末コード」を表します。数字の部分の「(?P<item_id>\d+)」は、マッチした部分をitem_idという名前の引数でビュー関数に渡すことを意味します。第2引数の「'ecsite.itempage.views.item_page_display'」は「ecsite.itempage.views」パッケージのビュー関数「item_page_display
」を呼ぶことを意味します。ビュー関数「item_page_display
」の実際のコードは以降で説明します。
ビュー関数の定義
最後にビュー関数をコーディングします。アプリケーションフォルダのviews.pyにitem_page_display
関数を定義します。item_page_display
関数の引数は、HTTPリクエストを表すHttpRequest
オブジェクトと、URLで指定されたitem_id
の2つです。item_id
引数は、URLディスパッチャの定義で説明したようにURLで指定されたitem_id
が渡されます。ビュー関数では、引数item_id
に該当するItem
オブジェクトをO/RマッパーのAPIを取得し、テンプレートとマージして、レスポンスを表すHttpResponse
オブジェクトを返します。HttpResponseのコンストラクタには、画面に表示するHTMLの文字列を設定します。
from django.http import HttpResponse from django.template import Context, loader from models import Item def item_page_display(request,item_id): # item_idに該当するオブジェクトを取得する item = Item.objects.get(id=item_id) # テンプレートを取得して、モデルの値とマージする t = loader.get_template('page/item.html') c = Context( {'item':item } ) # HTTP Responseを返す。 return HttpResponse(t.render(c))
item_page_display
関数内で使われている処理の簡単な説明を以下の表に示します。
処理 | 説明 |
Item.objects.get(id=item_id) | Modelクラスのobjects属性は、オブジェクトマネージャと呼ばれ、DBから指定した条件に合ったオブジェクトや集合を取得するメソッドをもっています。getメソッドは、引数に指定された検索条件に合致する単一のオブジェクトを取得します。 |
loader.get_template('page/item.html') | loaderクラスのget_templateメソッドは引数で指定されたテンプレートファイルを表したインスタンスを返します。テンプレートファイルのパスは、settings.pyファイルの「TEMPLATE_DIRS」に設定したフォルダからの相対パスを指定します。 |
Context({'item':item }) | Contextクラスには、テンプレートに渡すデータを辞書形式で指定します。ここでは「item」という名前でItemクラスのインスタンスを設定しています。 |
t.render(c) | Templateクラスのrenderメソッドは引数にContextクラスのインスタンスを受取り、テンプレート文字列とContextの情報をマージして文字列として返します。 |
商品ページの表示
商品画面表示のためのそれぞれの設定、ファイル作成がひととおり終わったところでブラウザから「http://localhost:8000/item/1/」にアクセスしてみましょう。図7のような画面が表示されれば成功です。
まとめ
Django の最初のステップ(モデル作成、HTML画面の表示)について駆け足で説明してきましたが、いかがでしたでしょうか。Djangoは、簡単に簡潔できれいなアプリケーションを書くための仕組みが数多く用意されていて、快適にアプリケーションを開発することができます。前編のチュートリアルだけでも、ひととおり動くWebアプリケーションが10分もあれば開発できることがご理解いただけたかのではないかと思います。後編では、モデルAPIや、その他Djangoが用意している便利な機能を使用して、アプリケーションを拡張していきます。
参考資料
- Djangoプロジェクト本家サイト
- 『開発のプロが教える標準Django完全解説―Webアプリケーションフレームワーク』 増田泰・中居良介・露木誠・松原豊 著、アスキー・メディアワークス、2008年6月