フラットページ (flatpages) アプリ¶
Django にはオプションで "flatpages" アプリケーションが付属しています。これを使えば、"フラットな" HTML コンテンツをデータベースに保存することができ、 Django のadmin インタフェースや Python API を使って管理できます。
フラットページは、URL、タイトル、コンテンツを持つオブジェクトです。これは、 "About" や "Privacy Policy" などのワンオフの特別なページに使用します。データベースに保存する必要はあるが、カスタムのDjangoアプリを開発する必要がない場合に利用します。
フラットページはカスタムテンプレートまたはデフォルトのシステム全体のフラットページテンプレートを使用できます。1 つまたは複数のサイトに関連付けることができます。
コンテンツフィールドは空のままにしておくこともできます。カスタムテンプレートにコンテンツを入れる場合に便利です。
インストール¶
flatpages アプリをインストールするには、以下の手順に従ってください:
もし設定にまだ含まれていない場合は、
'django.contrib.sites'
をあなたのINSTALLED_APPS
設定に追加することでsites フレームワーク
をインストールしてください。また、
SITE_ID
に設定ファイルが表すサイトのIDが正しく設定されていることを確認してください。これは通常1
になります (つまりSITE_ID = 1
ですが、複数のサイトを管理するためにsitesフレームワークを使用している場合は、別のサイトのIDになる可能性があります) 。INSTALLED_APPS
設定に'django.contrib.flatpages'
を追加してください。
そして、下記のいずれかを行います:
URLconf にエントリを追加します。例えば、次のようにします:
urlpatterns = [ path("pages/", include("django.contrib.flatpages.urls")), ]
または:
django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
をMIDDLEWARE
設定に追加します。- コマンド
manage.py migrate
を実行します。
しくみ¶
manage.py migrate
は、データベースに2つのテーブル、django_flatpage
と django_flatpage_sites
を作成します。django_flatpage
は、URL をタイトルとテキストコンテンツのまとまりにマッピングするルックアップテーブルです。django_flatpage_sites
はフラットページをサイトに関連付けます。
URLconf を使う¶
フラットページをURLconfに含める方法はいくつかあります。以下のように、特定のパスをフラットページに割り当てることができます:
urlpatterns = [
path("pages/", include("django.contrib.flatpages.urls")),
]
「キャッチオール」パターンとして設定することもできます。この場合、そのパターンを他の urlpatterns の最後に配置することが重要です。
from django.contrib.flatpages import views
# Your other patterns here
urlpatterns += [
re_path(r"^(?P<url>.*/)$", views.flatpage),
]
警告
もし APPEND_SLASH
を False
に設定する場合、スラッシュを除去しないと、末尾にスラッシュのないキャッチオールパターンや flatpages にはマッチしません。
もう1つの一般的な設定方法は、フラットページを特定のページ数の限られたセットに使用し、URL をハードコーディングする方法です。これにより、url
テンプレートタグを使用してそれらを参照できます:
from django.contrib.flatpages import views
urlpatterns += [
path("about-us/", views.flatpage, {"url": "/about-us/"}, name="about"),
path("license/", views.flatpage, {"url": "/license/"}, name="license"),
]
ミドルウェア を使う¶
FlatpageFallbackMiddleware
は全ての作業を行うことができます。
-
class
FlatpageFallbackMiddleware
[ソース]¶ Django アプリケーションが 404 エラーを出すたびに、このミドルウェアは最後の手段 して、リクエストされた URL があるか flatpages データベースをチェックします。具体的には、
SITE_ID
設定に対応するサイト ID を持つ、指定された URL のフラットページをチェックします。もしマッチが見つかった場合、次のアルゴリズムに従います:
- もし flatpage にカスタムテンプレートがあれば、そのテンプレートを読み込みます。そうでなければ、
flatpages/default.html
テンプレートを読み込みます。 - このテンプレートにはコンテキスト変数
flatpage
が渡されます。テンプレートのレンダリングにはRequestContext
を使用します。
ミドルウェアは結果のURLが有効なフラットページを参照している場合にのみ、末尾のスラッシュを追加してリダイレクトします (
APPEND_SLASH
設定を参照します) 。リダイレクトは永続的です(301ステータスコード)。マッチするものが見つからない場合は、リクエストは通常通り処理されます。
ミドルウェアは、404 エラーにのみアクティブ化され、500 エラーや他のステータスコードのレスポンスには適用されません。
- もし flatpage にカスタムテンプレートがあれば、そのテンプレートを読み込みます。そうでなければ、
フラットページはビュー・ミドルウェアを適用しません
FlatpageFallbackMiddleware
は、URL 解決が失敗し 404 エラーが発生した後にのみ適用されるため、返されるレスポンスには ビューミドルウェア のメソッドは適用されません。通常の URL 解決を経てビューに正常にルーティングされたリクエストのみが、ビューミドルウェアを適用します。
MIDDLEWARE
の順番は重要であることに注意してください。一般的には FlatpageFallbackMiddleware
をリストの最後に記述します。これは、レスポンスを処理するときに最初に実行されることを意味し、 他のレスポンス処理ミドルウェアが 404 ではなく本当のフラットページのレスポンスを見ることを保証します。
ミドルウェアについての詳細は ミドルウェアのドキュメント を参照してください。
404 テンプレートが正常に機能することを確認してください。
FlatpageFallbackMiddleware
は、別のビューが正常に 404 レスポンスを生成した後にのみ起動します。もし別のビューやミドルウェアクラスが 404 を生成しようとして例外を発生させた場合、そのレスポンスは HTTP 500 ("Internal Server Error") となり、 FlatpageFallbackMiddleware
はフラットページの提供を試みません。
フラットページの追加、変更、削除方法¶
警告
フラットページの追加や編集の権限は、信頼できるユーザに制限されるべきです。フラットページは生の HTML で定義され、 Django では サニタイズ されていません。その結果、悪意のあるフラットページは、パーミッションの昇格を含む様々なセキュリティ上の脆弱性を引き起こす可能性があります。
admin インターフェイス経由¶
Django の自動管理インターフェイスを有効にしていれば、管理インデックスページに "Flatpages" セクションがあるはずです。システムの他のオブジェクトを編集するのと同じように、 flatpages を編集してください。
フラットページ FlatPage
モデルには enable_comments
フィールドがあります。これは contrib.flatpages
では使用されませんが、あなたのプロジェクトやサードパーティアプリでは役に立つかもしれません。admin アプリケーションには表示されませんが、カスタム ModelAdmin
を FlatPage
に登録することで追加できます:
from django.contrib import admin
from django.contrib.flatpages.admin import FlatPageAdmin
from django.contrib.flatpages.models import FlatPage
from django.utils.translation import gettext_lazy as _
# Define a new FlatPageAdmin
class FlatPageAdmin(FlatPageAdmin):
fieldsets = [
(None, {"fields": ["url", "title", "content", "sites"]}),
(
_("Advanced options"),
{
"classes": ["collapse"],
"fields": [
"enable_comments",
"registration_required",
"template_name",
],
},
),
]
# Re-register FlatPageAdmin
admin.site.unregister(FlatPage)
admin.site.register(FlatPage, FlatPageAdmin)
Python API 経由¶
-
class
FlatPage
[ソース]¶ フラットページは標準の Django モデル で表現され、 django/contrib/flatpages/models.py にあります。 Django データベース API を使ってフラットページオブジェクトにアクセスできます。
重複するフラットページの URL をチェックする
自分自身のコードを使って flatpages を追加または変更する場合、同じサイト内で重複する flatpage の URL をチェックしたいと思うでしょう。admin アプリケーションで使用されている flatpage フォームはこの検証チェックを行い、django.contrib.flatpages.forms.FlatpageForm
からインポートして、独自のビューで使用できます。
フラットページのテンプレート¶
デフォルトでは、フラットページはテンプレート flatpages/default.html
を使ってレンダリングされますが、特定のフラットページに対してそれを上書きできます。admin アプリケーションでは、"Advanced options" (クリックすると展開されます) というタイトルの折りたたんだフィールドセットにテンプレート名を指定するフィールドがあります。Python API を使ってフラットページを作成する場合は、 FlatPage
オブジェクトの template_name
フィールドにテンプレート名を設定できます。
flatpages/default.html
テンプレートを作成するのはあなたの責任です。テンプレートディレクトリ内に、flatpages
ディレクトリを作成し、その中に default.html
ファイルを作成してください。
フラットページのテンプレートには、フラットページオブジェクトである flatpage
という1つのコンテキスト変数が渡されます。
以下は、サンプルの flatpages/default.html
テンプレートです:
<!DOCTYPE html>
<html>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>
フラットページの admin アプリケーションにはすでに生のHTMLを入力しているので、flatpage.title
と flatpage.content
の両方は、テンプレート内で 自動HTMLエスケープ を 必要としない とマークされています。
テンプレート内の FlatPage
オブジェクトの一覧を取得する¶
flatpages アプリには、 現在のサイト で利用可能なすべてのフラットページをイテレートするためのテンプレートタグが提供されています。
すべてのカスタムテンプレートタグと同様に、使用する前にカスタムタグライブラリを 読み込む必要があります 。ライブラリを読み込んだ後、get_flatpages
タグを通じてすべての現在のフラットページを取得できます。
{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
{% for page in flatpages %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
registration_required
フラットページを表示する¶
デフォルトでは、 get_flatpages
テンプレートタグは registration_required = False
とマークされたフラットページのみを表示します。登録保護されたフラットページを表示したい場合は、for
節を使用して認証済みユーザーを指定する必要があります。
例:
{% get_flatpages for someuser as about_pages %}
匿名ユーザーを提供すると、get_flatpages
はユーザーを提供していない場合と同じように動作します。つまり、公開されているフラットページのみを表示します。
ベースURLでフラットページを制限する¶
オプションの引数 starts_with
を指定すると、返されるページを特定のベースURLで始まるものに限定できます。この引数は文字列として渡されるか、コンテキストから解決される変数として渡されます。
例:
{% get_flatpages '/about/' as about_pages %}
{% get_flatpages about_prefix as about_pages %}
{% get_flatpages '/about/' for someuser as about_pages %}
django.contrib.sitemaps
と統合する¶
-
class
FlatPageSitemap
[ソース]¶ sitemaps.FlatPageSitemap
クラスは、現在のSITE_ID
(詳細はsites ドキュメント
を参照) に定義されたすべての公開されているflatpages
を見て、サイトマップにエントリを作成します。これらのエントリには、location
属性のみが含まれます。lastmod
やchangefreq
,priority
は含まれません。
カスタマイズ例¶
以下は FlatPageSitemap
を使用したURLconfの例です:
from django.contrib.flatpages.sitemaps import FlatPageSitemap
from django.contrib.sitemaps.views import sitemap
from django.urls import path
urlpatterns = [
# ...
# the sitemap
path(
"sitemap.xml",
sitemap,
{"sitemaps": {"flatpages": FlatPageSitemap}},
name="django.contrib.sitemaps.views.sitemap",
),
]