# Django 5.0.9.dev20240806133106 ドキュメント

# フラットページ (flatpages) アプリ

Django にはオプションで "flatpages" アプリケーションが付属しています。これを使えば、"フラットな" HTML コンテンツをデータベースに保存することができ、 Django のadmin インタフェースや Python API を使って管理できます。

フラットページは、URL、タイトル、コンテンツを持つオブジェクトです。これは、 "About" や "Privacy Policy" などのワンオフの特別なページに使用します。データベースに保存する必要はあるが、カスタムのDjangoアプリを開発する必要がない場合に利用します。

フラットページはカスタムテンプレートまたはデフォルトのシステム全体のフラットページテンプレートを使用できます。1 つまたは複数のサイトに関連付けることができます。

コンテンツフィールドは空のままにしておくこともできます。カスタムテンプレートにコンテンツを入れる場合に便利です。

## インストール

flatpages アプリをインストールするには、以下の手順に従ってください:

1. もし設定にまだ含まれていない場合は、 `'django.contrib.sites'` をあなたの `INSTALLED_APPS` 設定に追加することで `sites フレームワーク` をインストールしてください。

   また、 `SITE_ID` に設定ファイルが表すサイトのIDが正しく設定されていることを確認してください。これは通常 `1` になります (つまり `SITE_ID = 1` ですが、複数のサイトを管理するためにsitesフレームワークを使用している場合は、別のサイトのIDになる可能性があります) 。

2. `INSTALLED_APPS` 設定に `'django.contrib.flatpages'` を追加してください。

そして、下記のいずれかを行います:

3. URLconf にエントリを追加します。例えば、次のようにします:

       urlpatterns = [
           path("pages/", include("django.contrib.flatpages.urls")),
       ]

または:

3. `django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'` を `MIDDLEWARE` 設定に追加します。
4. コマンド `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 エラーや他のステータスコードのレスポンスには適用されません。

フラットページはビュー・ミドルウェアを適用しません

`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",
        ),
    ]