# Django 6.0.7 ドキュメント

# フラットページ (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 にはマッチしません。

もう一つの一般的な設定方法は、フラットページを特定のページ数の限られたセットに使用し、それらの URL を URLconf にハードコードすることです。

    from django.contrib.flatpages import views

    urlpatterns += [
        path("about-us/", views.flatpage, kwargs={"url": "/about-us/"}, name="about"),
        path("license/", views.flatpage, kwargs={"url": "/license/"}, name="license"),
    ]

`kwargs` 引数には、フラットページビューで `FlatPage` モデルを検索する際に使用する `url` 値を設定します。

name` 引数を設定すると、テンプレート内でURLを逆引きできるようになります。たとえば、 `url` テンプレートタグで使用できます。

### ミドルウェア を使う

`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 経由

フラットページは、標準的な Django モデル である `FlatPage` によって表現されます。フラットページのオブジェクトには、Django のデータベース API を通じてアクセスできます。

重複するフラットページの URL をチェックする

自分自身のコードを使って flatpages を追加または変更する場合、同じサイト内で重複する flatpage の URL をチェックしたいと思うでしょう。admin アプリケーションで使用されている flatpage フォームはこの検証チェックを行い、`django.contrib.flatpages.forms.FlatpageForm` からインポートして、独自のビューで使用できます。

## `FlatPage` モデル

class models.FlatPage

### フィールド

`FlatPage` オブジェクトには以下のフィールドがあります。

class models.FlatPage
  url

    必須です。100文字以下にする必要があります。検索高層化のためにインデックスが付与されます。

  title

    必須です。200文字以下にする必要があります。

  content

    任意項目です (`blank=True`)。通常はページの HTML コンテンツを含む `TextField` です。

  enable_comments

    真偽値です。このフィールドは `flatpages` では通常使用されず、管理インタフェースにも表示されません。詳細な説明は flatpages admin interface section を確認してください。

  template_name

    任意項目です (`blank=True`)。 70文字以下にする必要があります。ページをレンダリングするのに使うテンプレートを指定します。指定されない場合は `flatpages/default.html` がデフォルトで設定されます。

  sites

    `Site` との多対多（Many-to-Many）リレーションで、フラットページがどの sites 上で利用可能かを決定します。

### メソッド

class models.FlatPage
  get_absolute_url()

    `url` 属性に基づき、ページの相対URLパスを返します。

## フラットページのテンプレート

デフォルトでは、フラットページはテンプレート `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 lang="en">
    <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",
        ),
    ]