ソースコードから理解する技術-UnderSourceCode

手を動かす(プログラムを組む)ことで技術を理解するブログ

Django on Google App Engine-サンプルコード django_example(5)View層

今回はView層についてです。Model層に引き続き、view.pyに実装されています。
前の記事のurls.py の説明で書いたとおり
django_exampleはURL別に3つのviewのためのメソッドを実装しています。

まずはindex()です。


def index(request):
"""Request / -- show all gifts."""
user = users.GetCurrentUser()
gifts = db.GqlQuery('SELECT * FROM Gift ORDER BY created DESC')
return respond(request, user, 'list', {'gifts': gifts})

クエリを発行してデータを取得し、画面を表示するためのrespondヘルパー関数を呼び出しています。


次にnew()です。


def new(request):
"""Create a gift. GET shows a blank form, POST processes it."""
return edit(request, None)

このメソッドは、単にedit()を呼び出しているだけです。

次にedit()です。


def edit(request, gift_id):
"""Create or edit a gift. GET shows a blank form, POST processes it."""
user = users.GetCurrentUser()
if user is None:
return http.HttpResponseForbidden('You must be signed in to add or edit a gift')

gift = None
if gift_id:
gift = Gift.get(db.Key.from_path(Gift.kind(), int(gift_id)))
if gift is None:
return http.HttpResponseNotFound('No gift exists with that key (%r)' %
gift_id)

form = GiftForm(data=request.POST or None, instance=gift)

if not request.POST:
return respond(request, user, 'gift', {'form': form, 'gift': gift})

errors = form.errors
if not errors:
try:
gift = form.save(commit=False)
except ValueError, err:
errors['__all__'] = unicode(err)
if errors:
return respond(request, user, 'gift', {'form': form, 'gift': gift})

if not gift.giver:
gift.giver = user
gift.put()

return http.HttpResponseRedirect('/')


この関数はdjango_exampleの初期表示時、入力エラー時、データ登録時の画面遷移を実装しています。

初期表示時については、if not request.POST: で判定しています。
入力エラー時については、if errors: で判定しています。
そしてデータ登録時は、gift.put() でModelを登録後、
return http.HttpResponseRedirect('/')でパラメータなしの同じページ(つまりindex)を呼び出しています。


最後に画面遷移のためのrespond()ヘルパー関数です。


def respond(request, user, template, params=None):
"""Helper to render a response, passing standard stuff to the response.

Args:
request: The request object.
user: The User object representing the current user; or None if nobody
is logged in.
template: The template name; '.html' is appended automatically.
params: A dict giving the template parameters; modified in-place.

Returns:
Whatever render_to_response(template, params) returns.

Raises:
Whatever render_to_response(template, params) raises.
"""
if params is None:
params = {}
if user:
params['user'] = user
params['sign_out'] = users.CreateLogoutURL('/')
params['is_admin'] = (users.IsCurrentUserAdmin() and
'Dev' in os.getenv('SERVER_SOFTWARE'))
else:
params['sign_in'] = users.CreateLoginURL(request.path)
if not template.endswith('.html'):
template += '.html'
return shortcuts.render_to_response(template, params)


このメソッド内でDjangoのshortcuts.render_to_responseを呼び出し
表示するテンプレートを指定しています。