revision-up-to: | 8961 (1.0pre SVN) |
---|
Django にはオプションのアプリケーション、 “flatpages” が付属しています。 “flatpages” を使うと、データベースに素 (“flat”) の HTML コンテンツを Django の admin インタフェースや Python API から保存して管理できるようになります。
flatpage オブジェクトは、 URL、タイトル、内容だけからなる単純なオブジェクト です。 flatpage は一回限りしかレンダリングされないような、特殊なケースのペー ジ、例えば “About” や “Privacy Policy” のようなページで、データベースに保 存しておきたいがカスタムのアプリケーションを組むほどではないようなものに使っ て下さい。
flatpage ではカスタムのテンプレートも使えますし、デフォルトのシステム全体で 使われるフラットページテンプレートも使えます。フラットページは単一のサイト にも、複数のサイトにも関連づけできます。
自作のテンプレートにコンテンツを入れる場合、 content フィールドを空 (blank) にしておいてもよくなりました。
Django で構築されたサイトの中にも、 flatpages を使っているものがあります:
flatpages アプリケーションをインストールするには、以下の手順に従って下さい:
manage.py syncdb を実行すると、データベースには django_flatpages と django_flatpages_sites という二つのテーブルが作成されます。 django_flatpages は、 URL をタイトルとテキストコンテンツに関連づける単 純な検索テーブルです。 django_flatpages_sites は flatpage をサイトに関 連づけます。
全てのからくりは FlatpageFallbackMiddleware の中にあります。 Django アプリケーションのいずれかが 404 エラーを送出すると、 このミドルウェアが最後の試みとして、該当する URL がないかデータベースをチェッ クします。もっと詳しく言えば、ミドルウェアは、該当 URL に対応し、かつ サイト ID が SITE_ID に対応しているような flatpage がないか調べます。
一致するオブジェクトが見つかると、 flatpages ミドルウェアは以下のアルゴリズ ムに従って応答します:
条件に一致するオブジェクトがなければ、リクエストは通常通りに処理されます。
ミドルウェアが有効になるのは 404 レスポンスの場合だけです。 500 など、他の HTTP 状態コードでは有効になりません。
MIDDLEWARE_CLASSES の順番には注意が必要です。通常、このミドルウェ アはリクエストを処理する最後の段階なので、 FlatpageFallbackMiddleware はリストの末尾において下さい。
ミドルウェアの詳細は ミドルウェアのドキュメント を参照してくださ い。
404 テンプレートがあるか確かめましょう
Django が FlatpageFallbackMiddleware ビューを踏むのは、別のビューが 404 応答を生成したときだけだということに 注意しましょう。他のビューやミドルウェアで 404 を生成させようとして、実 際には別の例外を送出してしまった場合 (例えば、 404 例外に対応する適切な テンプレートを用意していなかった場合は、 TemplateDoesNotExist が 送出されます) には、応答は HTTP 500 (“Internal Server Error”) であり、 FlatpageFallbackMiddleware はフラットページを提供しようとしません
Django 自動管理インタフェースを有効にしていれば、 “Flatpages” セクションが admin インデクスページに表示されます。他のオブジェクトと同じように flatpages を編集してください。
デフォルトでは、 flatpages は flatpages/default.html テンプレート を使ってレンダリングされますが、このテンプレートはオーバライドできます。
オーバライドを行うには、 flatpages/default.html テンプレートを自分 で作成する必要があります。 flatpages ディレクトリを作成し、その下に default.html という名のテンプレートファイルを置いて下さい。
flatpage テンプレートに渡されるコンテキスト変数は flatpage の一つだ けです。この変数は flatpage オブジェクトを表します。
簡単な flatpages/default.html テンプレートの例を示しましょう:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>
flatpage の管理ページでは、生の HTML を入力しています。従って、 flatpage.title と flatpage.content は、テンプレート上で 自動 HTML エスケープ が必要なコンテンツとして 扱われません 。
Aug 31, 2012