フォームレンダリングAPI—Djangoドキュメント

提供:Dev Guides
< DjangoDjango/docs/2.2.x/ref/forms/renderers
移動先:案内検索

フォームレンダリング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` 設定で構成されているものに基づいてウィジェットテンプレートを検索します。

このレンダラーを組み込みのウィジェットテンプレートと一緒に使用するには、次のいずれかが必要です。

このレンダラーを使用するには、プロジェクトに必要なフォームテンプレートを確実に見つける必要があります。


ウィジェットテンプレートで利用可能なコンテキスト

ウィジェットテンプレートは、 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 レンダラーを使用する必要があります。 次に、ウィジェットテンプレートのオーバーライドは、プロジェクト内の他のテンプレートのオーバーライドと同じように機能します