==[[Django 最初のアプリケーション 4]]==[[Django 最初のアプリケーション 3]] | ] Django[Python][[Python]Django 最初のアプリケーション 3] | [[[[前]] |
Pythonの概要も分かり易い[[Python]]の概要も分かり易い.
{{amazon|477413760X}}
*SVN release http://docs.djangoproject.com/en/dev/intro/tutorial04/
*[[Django ]] 1.0 http://docs.djangoproject.com/en/1.0/intro/tutorial04/[[Django ]] 1.0を参考にサンプルアプリケーションを作成してみる
===シンプルなフォームの作成===
*ラジオボタンは、Choide IDと結び付けられており、名前は "choice"。選択して、サブミットしたときには、POSTデータは choice=3 のようになる。
*Formエレメントのactionに /polls/{{ poll.id }}/vote/ とし、method="post"としたが、これはDjangoに限らず、Web開発では重要。としたが、これは[[Django]]に限らず、Web開発では重要。
*fooloop.counter は、何回ループカウンタが回ったかをあらわす
===投票ビュー、結果表示ビューの作成===
*[[Django 最初のアプリケーション 3を思い出して、Voteビューを作成する3]]を思い出して、Voteビューを作成する
*mysite/polls/urls.py には、以下のように記述していた
====vote()、results()関数の記述====
*mysite/polls/views[[vi]]ews.py にvote()、results()関数を記述する
# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response, get_object_or_404
from django.http import HttpResponseRedirectHttp[[R]]esponse[[R]]edirect
from django.core.urlresolvers import reverse
from mysite.polls.models import Choice, Poll
selected_choice.votes +=1
selected_choice.save()
# 処理成功後は常にPOSTデータとともにHttpResponseRedirectを返す処理成功後は常にPOSTデータとともにHttp[[R]]esponse[[R]]edirectを返す
# これはユーザの2度押しによる再送信を防止する
return HttpResponseRedirect(reverse('mysite.polls.views[[vi]]ews.results', args=(p.id,)))
def results(request, poll_id):
*request.POST はディクショナリのようなオブジェクトで、サブミットされたデータをキーにより取得できる。上記の例では、request.POST['choice'] で、選択されたChoiceを文字列として取得できる
*request.POSTの値は常に文字列
*Djangoは同様に、request[[Django]]は同様に、request.GETも提供する。
*POSTデータとして送信されてこない場合、request.POST['choice'] は KeyErrorを引き起こす。
=====HttpResponseRedirectHttp[[R]]esponse[[R]]edirect=====*Choiceのカウントをインクリメントした後、HttpResponseではなく、コードのコメントにある理由から、HttpResponseRedirectを返すほうがよい。HttpResponseRedirectはリダイレクト先のURLを引数として1つ取る。Choiceのカウントをインクリメントした後、Http[[R]]esponseではなく、コードのコメントにある理由から、Http[[R]]esponse[[R]]edirectを返すほうがよい。Http[[R]]esponse[[R]]edirectはリダイレクト先のU[[R]]Lを引数として1つ取る。
=====reverse()=====
*HttpResponseRedirectで、reverseHttp[[R]]esponse[[R]]edirectで、reverse()関数をを使用しているが、この関数は、ビュー関数にURLをハードコーディングするのを避けるため。関数をを使用しているが、この関数は、ビュー関数にU[[R]]Lをハードコーディングするのを避けるため。*制御を渡したいビュー名および、そのビューを指すURLパターンの一部が変数として得られる。制御を渡したいビュー名および、そのビューを指すU[[R]]Lパターンの一部が変数として得られる。*今回、Django 今回、[[Django 最初のアプリケーション 3で行った設定では、reverse3]]で行った設定では、reverse()は、以下のような文字列を返す
'/polls/3/results/'
===ジェネリックビューを使う : コードの削減===
*detail()、results()、index()これらのビューは基本的なWeb開発の典型である。
*以下はとても一般的なので、Djangoは以下はとても一般的なので、[[Django]]は"ジェネリックビュー"というショートカットを提供する**URLから取得したパラメータでデータベースからデータを取得U[[R]]Lから取得したパラメータでデータベースからデータを取得
**テンプレートをロードして、レンダリングしたテンプレートを返す
*ジェネリックビューは共通パターンを抽象化する。
Generic views abstract common patterns to the point where you don't even need to write [[Python ]] code to write an app.