フラットページ (flatpages) アプリLink to this heading

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

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

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

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

インストールLink to this heading

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

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

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

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

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

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

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

または:

  1. django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'MIDDLEWARE 設定に追加します。

  2. コマンド manage.py migrate を実行します。

しくみLink to this heading

manage.py migrate は、データベースに2つのテーブル、django_flatpagedjango_flatpage_sites を作成します。django_flatpage は、URL をタイトルとテキストコンテンツのまとまりにマッピングするルックアップテーブルです。django_flatpage_sites はフラットページをサイトに関連付けます。

URLconf を使うLink to this heading

フラットページをURLconfに含める方法はいくつかあります。以下のように、特定のパスをフラットページに割り当てることができます。

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

「キャッチオール」パターンとして設定することもできます。この場合、そのパターンを他の urlpatterns の最後に配置することが重要です。

Code
from django.contrib.flatpages import views

# Your other patterns here
urlpatterns += [
    re_path(r"^(?P<url>.*/)$", views.flatpage),
]

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

Code
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 テンプレートタグで使用できます。

ミドルウェア を使うLink to this heading

FlatpageFallbackMiddleware は全ての作業を行うことができます。

class FlatpageFallbackMiddlewareLink to this definition

Django アプリケーションが 404 エラーを出すたびに、このミドルウェアは最後の手段 して、リクエストされた URL があるか flatpages データベースをチェックします。具体的には、 SITE_ID 設定に対応するサイト ID を持つ、指定された URL のフラットページをチェックします。

もしマッチが見つかった場合、次のアルゴリズムに従います:

  • もし flatpage にカスタムテンプレートがあれば、そのテンプレートを読み込みます。そうでなければ、 flatpages/default.html テンプレートを読み込みます。

  • このテンプレートにはコンテキスト変数 flatpage が渡されます。テンプレートのレンダリングには RequestContext を使用します。

ミドルウェアは結果のURLが有効なフラットページを参照している場合にのみ、末尾のスラッシュを追加してリダイレクトします (APPEND_SLASH 設定を参照します) 。リダイレクトは永続的です(301ステータスコード)。

マッチするものが見つからない場合は、リクエストは通常通り処理されます。

ミドルウェアは、404 エラーにのみアクティブ化され、500 エラーや他のステータスコードのレスポンスには適用されません。

MIDDLEWARE の順番は重要であることに注意してください。一般的には FlatpageFallbackMiddleware をリストの最後に記述します。これは、レスポンスを処理するときに最初に実行されることを意味し、 他のレスポンス処理ミドルウェアが 404 ではなく本当のフラットページのレスポンスを見ることを保証します。

ミドルウェアについての詳細は ミドルウェアのドキュメント を参照してください。

フラットページの追加、変更、削除方法Link to this heading

admin インターフェイス経由Link to this heading

Django の自動管理インターフェイスを有効にしていれば、管理インデックスページに "Flatpages" セクションがあるはずです。システムの他のオブジェクトを編集するのと同じように、 flatpages を編集してください。

フラットページ FlatPage モデルには enable_comments フィールドがあります。これは contrib.flatpages では使用されませんが、あなたのプロジェクトやサードパーティアプリでは役に立つかもしれません。admin アプリケーションには表示されませんが、カスタム ModelAdminFlatPage に登録することで追加できます:

Code
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 経由Link to this heading

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

FlatPage モデルLink to this heading

class models.FlatPageLink to this definition

フィールドLink to this heading

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

class models.FlatPage
urlLink to this definition

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

titleLink to this definition

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

contentLink to this definition

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

enable_commentsLink to this definition

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

template_nameLink to this definition

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

sitesLink to this definition

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

メソッドLink to this heading

class models.FlatPage
get_absolute_url()Link to this definition

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

フラットページのテンプレートLink to this heading

デフォルトでは、フラットページはテンプレート flatpages/default.html を使ってレンダリングされますが、特定のフラットページに対してそれを上書きできます。admin アプリケーションでは、"Advanced options" (クリックすると展開されます) というタイトルの折りたたんだフィールドセットにテンプレート名を指定するフィールドがあります。Python API を使ってフラットページを作成する場合は、 FlatPage オブジェクトの template_name フィールドにテンプレート名を設定できます。

flatpages/default.html テンプレートを作成するのはあなたの責任です。テンプレートディレクトリ内に、flatpages ディレクトリを作成し、その中に default.html ファイルを作成してください。

フラットページのテンプレートには、フラットページオブジェクトである flatpage という1つのコンテキスト変数が渡されます。

以下は、サンプルの flatpages/default.html テンプレートです:

Django template
<!DOCTYPE html>
<html lang="en">
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>

フラットページの admin アプリケーションにはすでに生のHTMLを入力しているので、flatpage.titleflatpage.content の両方は、テンプレート内で 自動HTMLエスケープ必要としない とマークされています。

テンプレート内の FlatPage オブジェクトの一覧を取得するLink to this heading

flatpages アプリには、 現在のサイト で利用可能なすべてのフラットページをイテレートするためのテンプレートタグが提供されています。

すべてのカスタムテンプレートタグと同様に、使用する前にカスタムタグライブラリを 読み込む必要があります 。ライブラリを読み込んだ後、get_flatpages タグを通じてすべての現在のフラットページを取得できます。

Django template
{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
    {% for page in flatpages %}
        <li><a href="{{ page.url }}">{{ page.title }}</a></li>
    {% endfor %}
</ul>

registration_required フラットページを表示するLink to this heading

デフォルトでは、 get_flatpages テンプレートタグは registration_required = False とマークされたフラットページのみを表示します。登録保護されたフラットページを表示したい場合は、for 節を使用して認証済みユーザーを指定する必要があります。

例:

Django template
{% get_flatpages for someuser as about_pages %}

匿名ユーザーを提供すると、get_flatpages はユーザーを提供していない場合と同じように動作します。つまり、公開されているフラットページのみを表示します。

ベースURLでフラットページを制限するLink to this heading

オプションの引数 starts_with を指定すると、返されるページを特定のベースURLで始まるものに限定できます。この引数は文字列として渡されるか、コンテキストから解決される変数として渡されます。

例:

Django template
{% get_flatpages '/about/' as about_pages %}
{% get_flatpages about_prefix as about_pages %}
{% get_flatpages '/about/' for someuser as about_pages %}

django.contrib.sitemaps と統合するLink to this heading

class FlatPageSitemapLink to this definition

sitemaps.FlatPageSitemap クラスは、現在の SITE_ID (詳細は sites ドキュメント を参照) に定義されたすべての公開されている flatpages を見て、サイトマップにエントリを作成します。これらのエントリには、 location 属性のみが含まれます。 lastmodchangefreq, priority は含まれません。

カスタマイズ例Link to this heading

以下は FlatPageSitemap を使用したURLconfの例です:

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