==[[Django 最初のアプリケーション 3 ]] (Viewの作成)==[[Django 最初のアプリケーション 4]] | ] Django[Python][[Python]Django 最初のアプリケーション 4] | [[[[前|Django 最初のアプリケーション 2]] | ]][[[[次]] |
Pythonの概要も分かり易い[[Python]]の概要も分かり易い.
{{amazon|477413760X}}
===方針===
<blockquote>Djangoアプリケーションにて、ビューは、Webページの『型』であり、特定の機能や、テンプレートを提供する。[[Django]]アプリケーションにて、ビューは、Webページの『型』であり、特定の機能や、テンプレートを提供する。</blockquote>
=====たとえば、ブログアプリケーションでは以下のようなビュー。=====
*ホームページ - 最新の2、3のエントリを表示
*エントリの詳細ページ - あるエントリへのパーマリンクあるエントリへのパーマ[[リンク]]
*年別アーカイブページ - ある年のエントリを月別表示
*月別アーカイブページ - ある月のエントリを日別表示
*投票ページ - 特定の調査に対する投票を選択する
<blockquote>Djangoではビューをシンプルな Pythonの関数で表現する[[Python]]の関数で表現する</blockquote>
===URLの設計U[[R]]Lの設計=======URLの構造を設計U[[R]]Lの構造を設計====*最初に、URLの構造を設計する最初に、U[[R]]Lの構造を設計する*これには、URLconfから呼び出される、Pythonのモジュールを作成するこれには、URLconfから呼び出される、[[Python]]のモジュールを作成する*URLconfは、DjangoがURLとPythonコードを結びつけるURLconfは、DjangoがURLと[[Python]]コードを結びつける
*Djangoで作成されたページにアクセスすると、システムは [[Django]]で作成されたページにアクセスすると、システムは ROOT_URLCONF設定を探す*ROOT_URLCONFはPythonのドット区切り文法で記述された文字列ROOT_URLCONFは[[Python]]のドット区切り文法で記述された文字列*Djangoはこのモジュールをロードし、呼び出されたURLパターンで、モジュールレベル変数を探す[[Django]]はこのモジュールをロードし、呼び出されたURLパターンで、モジュールレベル変数を探す*URLパターンは、以下の書式の[[Python サンプルコード|タプル] [タプル]
(正規表現, Python コールバック関数 [, オプションのディクショナリ])
*Djangoは、最初に正規表現が一致するまでリストを下っていく[[Django]]は、最初に正規表現が一致するまでリストを下っていく*一致するものが見つかったら、Djangoは、HttpRequestオブジェクトを最初の引数として、キーワード引数として、正規表現から捕捉された値、オプションで任意のディクショナリ(タプルの3つ目の項目)を伴って、Pythonコールバック関数を呼び出すを伴って、[[Python]]コールバック関数を呼び出す
====オブジェクト詳細====
====urls.pyの編集====
*[[Django 最初のアプリケーション 2] [|最初のアプリケーション 1]]で、django-admin.py startproject mysite を実行したとき、mysite/urls.py にデフォルトの URLconfを作成している。*自動的に、settings.pyファイルのROOT_URLCONF pyファイルの[[R]]OOT_U[[R]]LCONF 設定 にて、そのファイルを指定している ROOT_URLCONF [[R]]OOT_U[[R]]LCONF = 'mysite.urls'
*mysite/urls.pyを以下のように編集
# Example:
# (r'^mysite/', include('mysite.foo.urls')),
(r'^polls/$', 'mysite.polls.views[[vi]]ews.index'), (r'^polls/(?P<poll_id>\d+)/$', 'mysite.polls.views[[vi]]ews.detail'), (r'^polls/(?P<poll_id>\d+)/results/$', 'mysite.polls.views[[vi]]ews.results'), (r'^polls/(?P<poll_id>\d+)/vote/$', 'mysite.polls.views[[vi]]ews.vote'),
# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
# to INSTALLED_APPS to enable admin documentation:
# (r'^admin/doc/', include('dhttp://typea.info/tips/wiki.cgi?action=EDIT&page=[[Django]]+%BA%C7%BD%E9%A4%CE%A5%A2%A5%D7%A5%EA%A5%B1%A1%BC%A5%B7%A5%E7%A5%F3+3&artno=2jango.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
====リクエストパラメータの解析====
上記の例では、"/polls/23/"というリクエストがあった場合、DjangoはPythonモジュールをロードする。これは、rというリクエストがあった場合、Djangoは[[Python]]モジュールをロードする。これは、r'^polls/(?P<poll_id>\d+)/$' にマッチするためであり、 mysite/polls/views.py.からdetail()関数が以下のように呼び出される。 detail(request=<HttpRequest Http[[R]]equest object>, poll_id='23')
*poll_id='23' の部分は、(?P<poll_id>\d+)から来ている
*丸括弧でパターンをを囲うことにより、テキストの一致を『捕捉』しビュー関数に引数として送信する。
*?P<poll_id> がパターンにマッチした場合の名称を定義している。
*\d+ は正規表現で数字の連続は[[正規表現]]で数字の連続
===最初のビュー===
[[File:0372_django_firstapp24.jpg]]
*これは、index() 関数を mysite/polls/views[[vi]]ews.py. に実装していないため。
====シンプルビューの実装====
*mysite/polls/views[[vi]]ews.py に以下を記述してみる from django.http import HttpResponseHttp[[R]]esponse
def index(request):
return HttpResponseHttp[[R]]esponse("Hello, world. You're at the poll index.")
[[File:0373_django_firstapp25.jpg]]
*引数をとる以下の関数を追加し、http://192.168.24.14:8080/polls/34/ にアクセス
def detail(request, poll_id):
return HttpResponseHttp[[R]]esponse("You're looking at poll %s." % poll_id)
[[File:0374_django_firstapp26.jpg]]
URLに入力したパラメータを取得できているU[[R]]Lに入力したパラメータを取得できている
===実際になにかするビュー===
====簡単なビューの作成====
*ビューは次の2つのうちどちらかを行う責任がある。
**リクエストされたページのコンテンツを含んだHttpResponseオブジェクトを返すリクエストされたページのコンテンツを含んだHttp[[R]]esponseオブジェクトを返す
**Http404のようなエラーを返す
*先ほどの例で、HttpResponseにメッセージを直接与えたように、Pollの最新の5件を出力するようにハードコーディングしてしまうと、ページの見た目を変えるためにPythonのコードに手を加えなければいけなくなってしまう。Pythonからデザインを分離するために、テンプレートを使用する。先ほどの例で、HttpResponseにメッセージを直接与えたように、Pollの最新の5件を出力するようにハードコーディングしてしまうと、ページの見た目を変えるために[[Python]]のコードに手を加えなければいけなくなってしまう。[[Python]]からデザインを分離するために、テンプレートを使用する。
*以下のコードはpolls/index.htmlテンプレートをロードし、Contextというテンプレート変数名とPythonオブジェクトのディクショナリを引き渡すhtmlテンプレートをロードし、Contextというテンプレート変数名と[[Python]]オブジェクトのディクショナリを引き渡す
from django.template import Context, loader
from mysite.polls.models import Poll
from django.http import HttpResponseHttp[[R]]esponse
def index(request):
'latest_poll_list': latest_poll_list
})
return HttpResponseHttp[[R]]esponse(t.render(c))
*ページをリロードするとテンプレートがまだないため、以下のようなエラーとなる
polls/index.html
*[[Django 最初のアプリケーション 2] [|最初のアプリケーション 2]]でsetting.pyに指定したTEMPLATE_DIRS のディレクトリ以下に、pollsディレクトリを作成し、index.htmlファイルを作成する
*loader.get_template('polls/index.html') は、"[テンプレートディレクトリ]/polls/index.html"をファイルシステム上では指すようになる
[[File:0375_django_firstapp27.jpg]]
=====ショートカット : render_to_response()=====
*テンプレートをロードするのによく使われる方法は、コンテキストとHttpResponseオブジェクトをテンプレートとともに詰めて返す。テンプレートをロードするのによく使われる方法は、コンテキストとHttp[[R]]esponseオブジェクトをテンプレートとともに詰めて返す。
書き直してみる
raise Http404
return render_to_response('polls/detail.html', { 'poll': p })
*Poll のIDが見つからない場合、HTTP のIDが見つからない場合、[[HTTP]] 404エラーを返す
*detail.htmlにとりあえず、以下の内容を記述
=====ショートカット : get_object_or_404()=====
*Djangoはこのような場合にもショートカットを提供[[Django]]はこのような場合にもショートカットを提供
from django.shortcuts import render_to_response, get_object_or_404
from mysite.polls.models import Poll
*詳しくは[http://docs.djangoproject.com/en/dev/topics/templates/#topics-templates テンプレートガイド]参照
===URLconfsU[[R]]Lconfs===
====簡単にする====
*各コールバック関数共通の、「mysite.polls.vews」をプレフィックスとして外だしできる
)
=====mysite/polls/urls.py=====
*正規表現から、polls[[正規表現]]から、polls/ を取り除く。*こうすることにより、/polls/から、ほかのURLへの移動も簡単になるから、ほかのU[[R]]Lへの移動も簡単になる urlpatterns = patterns('mysite.polls.views[[vi]]ews',
(r'^$', 'index'),
(r'^(?P<poll_id>\d+)/$', 'detail'),
)
[[Django 最初のアプリケーション 4]] | ] [[[前|Django 最初のアプリケーション 2]] | ]][[[[次]] |