フォームレンダリングAPI
Djangoのフォームウィジェットは、Djangoのテンプレートエンジンシステムを使用してレンダリングされます。
フォームのレンダリングプロセスは、いくつかのレベルでカスタマイズできます。
- ウィジェットはカスタムテンプレート名を指定できます。
- フォームとウィジェットは、カスタムレンダラークラスを指定できます。
- ウィジェットのテンプレートは、プロジェクトによってオーバーライドできます。 (再利用可能なアプリケーションは、プロジェクトのカスタムテンプレートと競合する可能性があるため、通常、組み込みテンプレートを上書きしないでください。)
低レベルのレンダリングAPI
フォームテンプレートのレンダリングは、カスタマイズ可能なレンダラークラスによって制御されます。 カスタムレンダラーは、:setting: `FORM_RENDERER` 設定を更新することで指定できます。 デフォルトは' django.forms.renderers.DjangoTemplates 'です。
Form.default_renderer 属性を設定するか、 Widget.render()のrenderer引数を使用して、カスタムレンダラーを提供することもできます。
組み込みのテンプレートフォームレンダラーのいずれかを使用するか、独自に実装します。 カスタムレンダラーは、render(template_name, context, request=None)メソッドを実装する必要があります。 レンダリングされたテンプレートを(文字列として)返すか、 TemplateDoesNotExist を発生させる必要があります。
組み込みテンプレートフォームレンダラー
DjangoTemplates
- class DjangoTemplates
このレンダラーは、スタンドアロンの DjangoTemplates エンジンを使用します(:setting: `TEMPLATES` 設定で構成したものとは接続されていません)。 最初にdjango/forms/templatesの組み込みフォームテンプレートディレクトリからテンプレートをロードし、次に app_directories ローダーを使用してインストール済みアプリのテンプレートディレクトリからテンプレートをロードします。
コンテキストプロセッサなど、:setting: `TEMPLATES` 設定からカスタマイズしてテンプレートをレンダリングする場合は、 TemplatesSetting レンダラーを使用します。
Jinja2
- class Jinja2
このレンダラーは、 Jinja2 バックエンドを使用することを除いて、 DjangoTemplates レンダラーと同じです。 組み込みウィジェットのテンプレートはdjango/forms/jinja2にあり、インストールされたアプリはjinja2ディレクトリにテンプレートを提供できます。
このバックエンドを使用するには、プロジェクトとそのサードパーティアプリのすべてのウィジェットにJinja2テンプレートが必要です。 ウィジェットがないウィジェット用に独自のJinja2テンプレートを提供しない限り、このレンダラーを使用することはできません。 たとえば、 django.contrib.admin には、Djangoテンプレートタグが使用されているため、ウィジェット用のJinja2テンプレートは含まれていません。
TemplatesSetting
- class TemplatesSetting
このレンダラーを使用すると、ウィジェットテンプレートのソースを完全に制御できます。 get_template()を使用して、:setting: `TEMPLATES` 設定で構成されているものに基づいてウィジェットテンプレートを検索します。
このレンダラーを組み込みのウィジェットテンプレートと一緒に使用するには、次のいずれかが必要です。
'django.forms'の :setting: `INSTALLED_APPS` と少なくとも1つのエンジン :setting: `APP_DIRS = True ` 。組み込みのウィジェットテンプレートディレクトリをに追加する :setting: `DIRS ` テンプレートエンジンの1つです。 そのパスを生成するには:
import django django.__path__[0] + '/forms/templates' # or '/forms/jinja2'
このレンダラーを使用するには、プロジェクトに必要なフォームテンプレートを確実に見つける必要があります。
ウィジェットテンプレートで利用可能なコンテキスト
ウィジェットテンプレートは、 Widget.get_context()からコンテキストを受け取ります。 デフォルトでは、ウィジェットはコンテキスト内の単一の値widgetを受け取ります。 これは、次のような値を含む辞書です。
namevalueattrsis_hiddentemplate_name
一部のウィジェットは、コンテキストにさらに情報を追加します。 たとえば、Inputをサブクラス化するすべてのウィジェットはwidget['type']を定義し、 MultiWidget はループの目的でwidget['subwidgets']を定義します。
組み込みのウィジェットテンプレートのオーバーライド
各ウィジェットには、input.htmlなどの値を持つtemplate_name属性があります。 組み込みのウィジェットテンプレートは、django/forms/widgetsパスに保存されます。 たとえば、django/forms/widgets/input.htmlを定義することにより、input.htmlのカスタムテンプレートを提供できます。 各ウィジェットのテンプレートの名前については、組み込みウィジェットを参照してください。
ウィジェットテンプレートをオーバーライドするには、 TemplatesSetting レンダラーを使用する必要があります。 次に、ウィジェットテンプレートのオーバーライドは、プロジェクト内の他のテンプレートのオーバーライドと同じように機能します。