フォームレンダリング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
を受け取ります。 これは、次のような値を含む辞書です。
name
value
attrs
is_hidden
template_name
一部のウィジェットは、コンテキストにさらに情報を追加します。 たとえば、Input
をサブクラス化するすべてのウィジェットはwidget['type']
を定義し、 MultiWidget はループの目的でwidget['subwidgets']
を定義します。
組み込みのウィジェットテンプレートのオーバーライド
各ウィジェットには、input.html
などの値を持つtemplate_name
属性があります。 組み込みのウィジェットテンプレートは、django/forms/widgets
パスに保存されます。 たとえば、django/forms/widgets/input.html
を定義することにより、input.html
のカスタムテンプレートを提供できます。 各ウィジェットのテンプレートの名前については、組み込みウィジェットを参照してください。
ウィジェットテンプレートをオーバーライドするには、 TemplatesSetting レンダラーを使用する必要があります。 次に、ウィジェットテンプレートのオーバーライドは、プロジェクト内の他のテンプレートのオーバーライドと同じように機能します。