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)

これについて興味深いのは:

  1. 先ほど作成したメソッドと違い、テンプレートを指定せずにexposeします。これはこのメソッドがユーザをViewingのページにリダイレクトするためです。
  2. データベースがトランザクションをサポートしていれば、暗黙的にトランザクションが設定されます。このメソッドの中でpage.dataの後に "raise ValueError?" を追加すれば、実際にはデータベースに保存されていないことがわかるでしょう。例外が起こらなければデータはコミットされます。例外が起こると、変更はロールバックされます。このルールへの例外はリダイレクトします: これらはこのメソッドの例外をエラーとは認識しません。
  3. "page.data = data" はUPDATE SQL宣言を実行しています。
  4. turbogears.flash()の呼び出しは、ブラウザにノーティフィケーションメッセージをセットします。master.kidテンプレートの "tg_flash"変数を参照してください。
  5. リダイレクトは例外として引き起こされるため、他のプロセスは迂回されます。とってもお手軽!

先に進んみましょう!ページを編集して保存することができますよ。とってもWikiみたいじゃないですか?

Go back to page 2 | Continue on to page 4