2008年6月8日日曜日

展覧会案内webサービスを作る(5) 入力ページを作る

Google AppEngineを使って展覧会案内葉書のデータベースサービスを作りますよの続き

案内葉書データを入力するページを作る

ページを作成するのは、なんと言うかセンスが無いし大変なので、よそから頂戴することにした
http://www.phpform.org/


入力ページはloginしないと作成できない様にapp.yamlファイルに設定を記述する
- url: /inputpage
login: required
script: forlune.py
新規作成する場合と、既存のデータを編集する場合があるので、httpリクエストのクエリとしてkey=xxxを処理するようにした

class InputPage(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
key = self.request.get('key')

if key:
entity = db.get(key)
else:
entity = PostCard( \
date_s = datetime.date.today() + datetime.timedelta(hours=9), \
date_e = datetime.date.today() + datetime.timedelta(hours=9,days=1), \
opentime = datetime.time(hour=10,minute=0,second=0), \
closetime = datetime.time(hour=18,minute=0,second=0) \
)


members = ",".join(entity.members)
images = ",".join(entity.images)

template_values = {
'key' : key,
'members': members,
'images' : images,
'entity' : entity
}
path = os.path.join(os.path.dirname(__file__),'input.html')
self.response.out.write(template.render(path,template_values))


members,imagesはStringListPropertyなので、連結して単一の文字列オブジェクトにしておいた
template内でfor文を使って処理することもできるけど、このほうがスッキリする?

入力フォームページはtemlateとして使用するので初期値をvalue="{{ entity.title|default:"" }}"のように書き換えておく

入力したフォームを処理するcgiとしてformタグにaction="/postcard"としておく
アプリ側でPOSTされたデータを識別するためにフォームにkeyデータを埋め込んでおく
<input type="hidden" name="key" value="{{key}}" />

これで、アプリは
key = self.request.get('key')
if key:
postcard = db.get(key)
else:
postcard = PostCard()

の様に新規作成されたデータか、既存のデータを編集したのかを判断できる
後は、Postされたフォームのデータをひたすら拾ってデータベースにputする


class PutCard(webapp.RequestHandler):
def post(self):
key = self.request.get('key')
if key:
postcard = db.get(key)
else:
postcard = PostCard()

postcard.images = self.request.get('images').rsplit(',')
postcard.title = self.request.get('title_name')
postcard.place = self.request.get('place')
postcard.address = self.request.get('address')
postcard.zip = self.request.get('zip')
db.put(postcard)

self.redirect('/?kind=all')


最後にルートにリダイレクトして終わり
これで、とりあえず使えるページが出来た。
ただ、見栄えとか良くしたり、早見表みたいなのをつけたりしたい

0 件のコメント: