フラットページとはDjangoで固定ページを作成する機能です。
固定ページとは「会社概要」「プライバシーポリシー」など、時系列な記事ではなく編集されることがとても少ないページのことです。
「プライバシーポリシー」など、なくてはならないページを作成するために、ぜひフラットページを活用してください。
フラットページとは
前述の通り、フラットページは固定ページを作成するための機能です。
フラットページは後述するサイトフレームワークと連携して単一ページを作成できるようになります。
作成した記事はAdminサイトや自作の管理ページなどで編集可能となり、更新もやりやすくなります。
必要な設定
必要な設定は2つあります。
以下の2項目を有効化します。
- フラットページアプリ
- サイトフレームワーク
フラットページアプリとサイトフレームは自分で設定しなければなりません。
内容は公式ドキュメントに記載されています。
公式ドキュメント: フラットページアプリ
では、必要な部分を追加します。
settings.py
を見てみましょう。
その中にINSTALLED_APPS
というリストがあります。
ここにフラットページとサイトフレームワークを追加します。
INSTALLED_APPS = [
...
'django.contrib.flatpages',
'django.contrib.sites',
...
]
そして、サイトIDを設定します。
こちらも、settings.py
に記述します。ただの変数に値を代入するだけです。
SITE_ID = 1
これでOKです。
サイトフレームワークとは
サイトフレームワークの説明がまだでしたね。
Djangoは作成された当時から複数のサイトを公開できるように設計されています。
複数のサイトを公開というのは、Djangoはひとつだけ使用しても複数サイトを作成して運用できる仕組みがある、ということです。
ひとつのアプリケーションを複数のサイトで使用できたりします。
例えばblog
というアプリケーションを作成すれば、siteA
でもsiteB
でもblog
アプリケーションが使える、ということです。
もちろん、設定ファイルを含むプロジェクトファイルを増やす必要などはあります。
サイトIDも変更しなければなりません。
普段私たちがDjangoでサイト作成する時は単独のサイトを作ることが多いです。
ですのでデフォルトでは有効化されていませんが、有効化する事で複数サイトを運用する設定をオンにすることができます。
なぜこんな機能があるのか
少し横道にそれますが、なぜ「サイトフレームワーク」が存在するのか短く紹介します。
Djangoはもともとニューズサイトを作成するためのフレームワークだったそうです。
その際作成するサイトは2つあり、ひとつはニュースでひとつは娯楽にスポットを当てたサイトを作成する必要があったようです。
しかし、同じ記事をどちらのサイトにも掲載する必要もあります。そんなときのために、複数サイトを作成できる仕組みと、必要であれば複数サイトに同じ記事を投稿できる仕組みを用意したようです。
要は、Djangoはこのような要件にも対応できるということでした。
フラットページの動作
フラットページの動作について知る必要はないのです特徴的な動作がありますので紹介します。
アクセスされたurlを探索しても見つからなかった時にだけフラットページのURLを探索します。
面白い動作ですので知っておいて下さい。
URLが重複していると動作しないという事です。
フラットページのテンプレート
フラットページのテンプレートはテンプレートフォルダの中にあるflatpages
フォルダを探索します。
デフォルトのテンプレート名はdefault.html
です。
管理画面でテンプレート名を入力できるようになっていますが、空欄にすると使用されます。
渡される変数
フラットページのテンプレートに渡される変数は以下の通りです。
flatpage.title
flatpage.content
文字通り、タイトルと投稿内容を表示します。
フラットページのURL
フラットページはurls.py
にURLを設定する必要があります。
内容としてはDjangoが提供しているフラットページのURLをinclude
するだけです。
ただ、ひとつ注意があります。
他のアプリケーションのURLと重複するとフラットページのURLを探索してくれないので、接頭字だと思ってユニークなURLを設定してください。
以下に設定の例を紹介します。公式ドキュメントに記述されている内容です。
私もこのような設定にしてあります。
urlpatterns = [
path('pages/', include('django.contrib.flatpages.urls')),
]
ここでは、URLにpages/
を指定することで、他のURLとの重複を回避しています。
個人的な意見ですが、このようにしてフラットページのURLはそれを分かるURLに設定しておくべきと思います。
include
関数にてDjangoが提供しているフラットページのURLを指定しています。
これでだいたいの場合はうまくいくはずです。
サイトフレームワークが分かりづらいですが、やり方が理解できれば難しい要素はないと思います。
ウェブサイトには必須の機能ですので上手に活用してください。