Flatpage
とはDjangoの機能の一つで、固定ページを作成する機能を言います。
もちろん、固定ページは管理画面から編集できます。
固定ページのURLもそれぞれ追加できますので、管理側がDjangoに精通していなくてもコンテンツの作成ができます。
使用するには設定ファイルにいくつか追加する必要がありますので、その手順も一緒に解説します。
Flatpage使用のための設定
FlatpageはDjangoのコア機能の一つですが、有効化されていません。
設定ファイルに機能を読み込んで有効化しましょう。
INSTALLED_APPS
に以下の二つを追記します。
- 'django.contrib.sites'
- 'django.contrib.flatpages'
そして、さらに設定ファイルの後ろの方でよいので、SITE_ID=1
を追加します。
最後に、urls.py
にFlatpageのurls.py
を読みこませます。
以下は、ドキュメントからのサンプルコードです。
urlpatterns = [
path("pages/", include("django.contrib.flatpages.urls")),
]
これでOKです。
最後にDBのマイグレーションを行えば使える状態になります。
サイトフレームワーク
Flatpageを使用するのに「サイトフレームワーク」という機能も必要でしたので、有効化しています。
では、このサイトフレームワークとは何でしょうか。
サイトフレームワークとは、Djangoで複数のサイトを運用する時に使用できるフレームワークです。
特定のアプリをドメインに結びつけたりします。
細かいことは別稿とするとして、Flatpageはサイトフレームワークを使用するのだ、ということを知っておいてください。
SITE_ID=1
もサイトフレームワークで必要な設定です。
クラスベースビューで使ってみる
ドキュメントを見るとAdminサイトを使ったやり方が乗っていますし、それで十分な場合も多いと思います。
しかし、現場はそうはいかないので、ここではいつも通り独自のUIを使いうためにクラスベースビューを使用してCRUDできるようにしていきます。
実装は難しくなく、モデルをFlatpageのモデルを指定するだけで後は同じです。
from django.contrib.flatpages.models import FlatPage
from django.views.generic import (
ListView, CreateView, UpdateView, DetailView, DeleteView,
)
from .form import FlatPageForm
class FlatPageListView(ListView):
model = FlatPage
class FlatPageDetailView(DetailView):
model = FlatPage
# (省略)
このようにすれば、、Flatpageをいつも通りのモデルとして扱うことができます。
form.py
は以下のようにしています。
from django import forms
from django.contrib.flatpages.models import FlatPage
class FlatPageForm(forms.ModelForm):
class Meta:
model = FlatPage
fields = '__all__'
fields
に__all__
を使うはよくないのですが、ご容赦ください。
Flatpageにはタイトルと本文の他にURLとテンプレートを、それにサイトを指定するフィールドがあります。すべて必須ですのでご注意ください。
テンプレート
表示系のテンプレートでは必要な変数は以下の二つだと思います。
{{ flatpage.title }}
と{{ flatpage.content }}
です。読んで字のごとく、タイトルと本文です。
デフォルトでテンプレート名はflatpage/default.html
です。
Flatpageの編集ページでテンプレートを指定できます。
私はこれを作って、テンプレートでページを作るほどではないがリッチテキストでは記述しきれないページを作ったりしています。static
で画像をロードしたい時や、レイアウトが柔軟すぎて大変なときですね。
どのように動作しているのか
最後にこのFlatpageがどのようにして動作しているのかを説明しておきます。
通常DjangoにはURLのリクエストがあります。
そのときは通常のアプリケーションのURLを精査して、そこからマッチするURLを見つけて設定されているViewを実行します。
それから処理の結果をレスポンスとして返します。
Flatpageはへのアクセスは、通常のアプリケーションのURLを精査してリクエストにマッチするURLが見つからなかった場合にFlatpageのURLを探索します。
何が言いたいかというと、URLが重複するとFlatpageにアクセスされない、ということです。
優先度が低い、という言い方もできるかもしれません。
urls.py
でちゃんとURLを分けていれば重複することはないと思いますが、動作については知っておいてください。