フラットページアプリ
Djangoには、オプションの「フラットページ」アプリケーションが付属しています。 「フラットな」HTMLコンテンツをデータベースに保存し、Djangoの管理インターフェースとPythonAPIを介して管理を処理します。
フラットページは、URL、タイトル、およびコンテンツを持つオブジェクトです。 データベースに保存したいが、カスタムDjangoアプリケーションを開発したくない、「About」や「PrivacyPolicy」ページなどの1回限りの特別な場合のページに使用します。
フラットページでは、カスタムテンプレートまたはデフォルトのシステム全体のフラットページテンプレートを使用できます。 1つまたは複数のサイトに関連付けることができます。
コンテンツをカスタムテンプレートに配置する場合は、オプションでコンテンツフィールドを空白のままにすることができます。
インストール
フラットページアプリをインストールするには、次の手順に従います。
'django.contrib.sites'
を:setting: `INSTALLED_APPS` 設定に追加して、サイトフレームワークをインストールします(まだインストールされていない場合)。また、:setting: `SITE_ID` が設定ファイルが表すサイトのIDに正しく設定されていることを確認してください。 これは通常
1
(つまりSITE_ID = 1
ですが、サイトフレームワークを使用して複数のサイトを管理している場合は、別のサイトのIDである可能性があります。'django.contrib.flatpages'
を:setting: `INSTALLED_APPS` 設定に追加します。
次に、次のいずれかを行います。
URLconfにエントリを追加します。 例えば:
urlpatterns = [ path('pages/', include('django.contrib.flatpages.urls')), ]
また:
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
を:setting: `MIDDLEWARE` 設定に追加します。コマンドを実行します :djadmin: `manage.py移行 ` 。
使い方
manage.py migrate
は、データベースにdjango_flatpage
とdjango_flatpage_sites
の2つのテーブルを作成します。 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),
]
警告
:setting: `APPEND_SLASH` をFalse
に設定した場合、キャッチオールパターンのスラッシュを削除する必要があります。そうしないと、末尾のスラッシュがないフラットページは一致しません。
もう1つの一般的な設定は、既知のページの限られたセットにフラットページを使用し、URLをハードコーディングすることです。これにより、:ttag: `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についてフラットページデータベースをチェックします。 具体的には、:setting: `SITE_ID` 設定に対応するサイトIDを持つ指定されたURLのフラットページをチェックします。
一致するものが見つかると、次のアルゴリズムに従います。
フラットページにカスタムテンプレートがある場合は、そのテンプレートが読み込まれます。 それ以外の場合は、テンプレート
flatpages/default.html
をロードします。そのテンプレートに、フラットページオブジェクトである単一のコンテキスト変数
flatpage
を渡します。 テンプレートのレンダリングに RequestContext を使用します。
ミドルウェアは、結果のURLが有効なフラットページを参照している場合にのみ、末尾のスラッシュとリダイレクトを追加します(:setting: `APPEND_SLASH` 設定を確認することにより)。 リダイレクトは永続的です(301ステータスコード)。
一致するものが見つからない場合、リクエストは通常どおり処理され続けます。
ミドルウェアは404秒間のみアクティブ化され、500秒間または他のステータスコードの応答に対してはアクティブ化されません。
Flatpagesはビューミドルウェアを適用しません
FlatpageFallbackMiddleware
は、URL解決が失敗して404を生成した後にのみ適用されるため、返される応答はビューミドルウェアメソッドを適用しません。 通常のURL解決を介してビューに正常にルーティングされたリクエストのみがビューミドルウェアを適用します。
:setting: `MIDDLEWARE` の順序が重要であることに注意してください。 通常、リストの最後に FlatpageFallbackMiddleware を置くことができます。 これは、応答を処理するときに最初に実行され、他の応答処理ミドルウェアが404ではなく実際のフラットページ応答を参照することを保証することを意味します。
ミドルウェアの詳細については、ミドルウェアドキュメントをお読みください。
404テンプレートが機能することを確認します
FlatpageFallbackMiddleware は、別のビューが404応答を正常に生成した場合にのみステップインすることに注意してください。 別のビューまたはミドルウェアクラスが404を生成しようとしたが、代わりに例外が発生した場合、応答はHTTP 500(「内部サーバーエラー」)になり、 FlatpageFallbackMiddleware はフラットページを提供しようとしません。 。
フラットページを追加、変更、削除する方法
管理インターフェース経由
自動Django管理インターフェースをアクティブにした場合は、管理インデックスページに「フラットページ」セクションが表示されます。 システム内の他のオブジェクトを編集するときにフラットページを編集します。
FlatPage
モデルにはenable_comments
フィールドがあり、contrib.flatpages
では使用されませんが、プロジェクトやサードパーティのアプリには役立つ可能性があります。 管理インターフェースには表示されませんが、FlatPage
のカスタムModelAdmin
を登録することで追加できます。
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)
PythonAPI経由
- class FlatPage
- Flatpagesは、:source: `django / contrib / flatpages / models.py` にある標準の Djangoモデルで表されます。 DjangoデータベースAPI を介してフラットページオブジェクトにアクセスできます。
フラットページURLが重複していないか確認してください。
独自のコードを使用してフラットページを追加または変更する場合は、同じサイト内でフラットページのURLが重複していないかどうかを確認することをお勧めします。 管理者で使用されるフラットページフォームはこの検証チェックを実行し、django.contrib.flatpages.forms.FlatpageForm
からインポートして、独自のビューで使用できます。
フラットページテンプレート
デフォルトでは、フラットページはテンプレートflatpages/default.html
を介してレンダリングされますが、特定のフラットページに対してそれをオーバーライドできます。管理者では、「詳細オプション」というタイトルの折りたたまれたフィールドセット(クリックすると展開されます)には、テンプレート名。 Python APIを介してフラットページを作成している場合は、テンプレート名をFlatPage
オブジェクトのフィールドtemplate_name
として設定できます。
flatpages/default.html
テンプレートの作成はあなたの責任です。 テンプレートディレクトリに、ファイルdefault.html
を含むflatpages
ディレクトリを作成します。
Flatpageテンプレートには、フラットページオブジェクトである単一のコンテキスト変数flatpage
が渡されます。
サンプルのflatpages/default.html
テンプレートは次のとおりです。
<!DOCTYPE html>
<html>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>
フラットページの管理ページに生のHTMLを既に入力しているため、flatpage.title
とflatpage.content
の両方がとしてマークされ、自動HTMLエスケープを必要としませんテンプレート内。
テンプレート内の FlatPage オブジェクトのリストを取得する
flatpagesアプリは、現在のサイトで利用可能なすべてのflatpageを反復処理できるテンプレートタグを提供します。
すべてのカスタムテンプレートタグと同様に、使用する前にカスタムタグライブラリをロードする必要があります。 ライブラリをロードした後、:ttag: `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フラットページの表示
デフォルトでは、:ttag: `get_flatpages` テンプレートタグは、registration_required = False
とマークされたフラットページのみを表示します。 登録で保護されたフラットページを表示する場合は、for
句を使用して認証済みユーザーを指定する必要があります。
例えば:
{% get_flatpages for someuser as about_pages %}
匿名ユーザーを指定した場合、:ttag: `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 クラスは、現在の:setting: `SITE_ID` に対して定義されているすべての公開されているフラットページを調べます(サイトのドキュメントを参照) )そしてサイトマップにエントリを作成します。 これらのエントリには、 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'),
]