20 Minute Wiki Page 3
最初のページをチェックしよう!
http://localhost:8080/ にアクセスして、何が見えるかチェックしましょう!
あれれ、エラーが出てしまいました。我々は開発モードにいるので、CheryyPyはトレースバックを出力してくれます。便利ですね。トレースバックはSQLObjectNotFoundという例外が出たことを教えてくれています。あー、そういえば!ページをデータベースに入れるのを忘れていました!モデルブラウザであるCatWalkを使ってやってみましょう:
tg-admin toolbox
TurboGears?ツールボックスが新しいブラウザウインドウで開きます。CatWalkモデルブラウザをクリックしてください。左に "Page" がリストされているのが見えますので、それをクリックし、 "Add Page" タブを選んで "FrontPage" という名前でページを作成し、何でもよいのでデータにテキストを入れましょう。
これですべてです。データベースに新しいページを作成したのです。
ブラウザウィンドウを再読込すれば、ステキなページを見ることができるでしょう。
もっといいページにするには?
Wikiの特徴の一つは、 "Edit This Page" をクリックするだけでページを編集できることです。この所為でWikiスパムが来てしまうのですが、これをするまではスパマーはあなたのWiki20を見つけることはできないでしょう。
編集のためのテンプレートを作りましょう。 "page.kid" のコピーから始めしょう:
cd wiki20/templates cp page.kid edit.kid cd ../..
edit.kidの冒頭の部分を "Viewing" から "Editing" に変更します。データのための<div>を置換します:
<form action="save" method="post">
<input type="hidden" name="pagename" value="${page.pagename}"/>
<textarea name="data" py:content="page.data" rows="10" cols="60"/>
<input type="submit" name="submit" value="Save"/>
</form>
このテンプレートを使うものが必要ですので、コントローラに "edit" メソッドを追加しましょう:
@expose("wiki20.templates.edit")
def edit(self, pagename):
page = Page.byPagename(pagename)
return dict(page=page)
このメソッドはindexメソッドに非常に似ています。一番大きな違いは、indexメソッドがWikiコンテンツをHTMLとしてレンダリングしているのに対して、これはテキストとして返す点です。
editメソッドを使うためにpage.kidの下部に以下を追加します:
<p><a href="${tg.url('/edit', pagename=page.pagename)}">Edit this page</a></p>
これでOKです!ページを再読込すれば、editリンクが見えるはずです。リンクをたどればeditできるページに行くでしょう。まだ保存ボタンはクリックしないでくださいね!そのためのメソッドを書く必要があります。
編集部分を保存する
後のセクションでWikiフォームを表示するときに、 "save" というアクションを使います。ですのでコントローラの中でsaveというメソッドが必要になります。以下のようにします:
@expose()
def save(self, pagename, data, submit):
page = Page.byPagename(pagename)
page.data = data
turbogears.flash("Changes saved!")
raise turbogears.redirect("/", pagename=pagename)
これについて興味深いのは:
- 先ほど作成したメソッドと違い、テンプレートを指定せずにexposeします。これはこのメソッドがユーザをViewingのページにリダイレクトするためです。
- データベースがトランザクションをサポートしていれば、暗黙的にトランザクションが設定されます。このメソッドの中でpage.dataの後に "raise ValueError?" を追加すれば、実際にはデータベースに保存されていないことがわかるでしょう。例外が起こらなければデータはコミットされます。例外が起こると、変更はロールバックされます。このルールへの例外はリダイレクトします: これらはこのメソッドの例外をエラーとは認識しません。
- "page.data = data" はUPDATE SQL宣言を実行しています。
- turbogears.flash()の呼び出しは、ブラウザにノーティフィケーションメッセージをセットします。master.kidテンプレートの "tg_flash"変数を参照してください。
- リダイレクトは例外として引き起こされるため、他のプロセスは迂回されます。とってもお手軽!
先に進んみましょう!ページを編集して保存することができますよ。とってもWikiみたいじゃないですか?
Go back to page 2 | Continue on to page 4

