---
title: "Formulir membangun API"
version: 4.0
locale: id
source: https://docs.djangoproject.com/id/4.0/ref/forms/renderers/
canonical: https://djangodocs.dev/id/4.0/ref/forms/renderers/
---
# Formulir membangun API

Widgets formulir Django dibangun menggunakan Django's [template engines system](/id/4.0/topics/templates/).

Pengolahan membangun formulir dapat disesuaikan pada beberapa tingkat:

- Widget dapat menentukan nama-nama cetakan penyesuaian.
- Formulir dan widget dapat menentukan kelas-kelas pembangun penyesuaian.
- Sebuah cetakan widget dapat ditimpa oleh sebuah proyek. (Menggunakan kembali aplikasi tertentu jangan menimpa cetakan siap-pakai karena mereka mungkin bertentangan dengan cetakan-cetakan penyesuaian proyek.)

## Tingkat-rendah pembangun API

Pembangunan dari cetakan formulir dikendalikan oleh kelas pembangun penyesuaian. Sebuah pembangun penyesuaian dapat ditentukan dengan memperbaharui pengaturan [`FORM_RENDERER`](/id/4.0/ref/settings/#std-setting-FORM_RENDERER). Awalan itu pada `'`[`django.forms.renderers.DjangoTemplates`](#django.forms.renderers.DjangoTemplates)`'`.

Anda dapat juga menyediakan penyesuaian dibangun dengan mengatur atribut [`Form.default_renderer`](/id/4.0/ref/forms/api/#django.forms.Form.default_renderer) atau dengan menggunakan argumen `renderer` dari [`Widget.render()`](/id/4.0/ref/forms/widgets/#django.forms.Widget.render).

Gunakan satu dari [built-in template form renderers](#built-in-template-form-renderers) atau menerapkan anda sendiri. Pembangun penyesuaian harus menerapkan sebuah metode `render(template_name, context, request=None)`. Itu harus mengembalikan sebuah cetakan terbangun (sebagai string) atau memunculkan [`TemplateDoesNotExist`](/id/4.0/topics/templates/#django.template.TemplateDoesNotExist).

## Pembangun formulir cetakan-siap-pakai

### `DjangoTemplates`

#### `class DjangoTemplates`

Pembangun ini menggunakan mesin [`DjangoTemplates`](/id/4.0/topics/templates/#django.template.backends.django.DjangoTemplates) berdiri sendiri (tidak terhubung ke apa yang anda telah konfigurasikan dalam pengaturan [`TEMPLATES`](/id/4.0/ref/settings/#std-setting-TEMPLATES)). Itu memuat cetakan-cetakan pertama dari direktori cetakan formulir siap-pakai dalam `django/forms/templates` dan kemudian dari direktori cetakan aplikasi terpasang menggunakan pemuat [`app_directories`](/id/4.0/ref/templates/api/#django.template.loaders.app_directories.Loader).

Jika anda ingin membangun cetakan dengan penyesuaian dari pengaturan [`TEMPLATES`](/id/4.0/ref/settings/#std-setting-TEMPLATES) anda, seperti pengeolah konteks sebagai contoh, gunakan pembangun [`TemplatesSetting`](#django.forms.renderers.TemplatesSetting).

### `Jinja2`

#### `class Jinja2`

Pembangun ini adalah sama seperti pembangun [`DjangoTemplates`](#django.forms.renderers.DjangoTemplates) kecuali bahwa itu menggunakan sebuah backend [`Jinja2`](/id/4.0/topics/templates/#django.template.backends.jinja2.Jinja2). Cetakan-cetakan untuk widget siap-pakai ditempatkan dalam `django/forms/jinja2` dan aplikasi terpasang dapat menyediakan cetakan dalam direktori `jinja2`.

To use this backend, all the forms and widgets in your project and its
third-party apps must have Jinja2 templates. Unless you provide your own Jinja2
templates for widgets that don't have any, you can't use this renderer. For
example, [`django.contrib.admin`](/id/4.0/ref/contrib/admin/#module-django.contrib.admin) doesn't include Jinja2 templates for its
widgets due to their usage of Django template tags.

### `TemplatesSetting`

#### `class TemplatesSetting`

This renderer gives you complete control of how form and widget templates are
sourced. It uses [`get_template()`](/id/4.0/topics/templates/#django.template.loader.get_template) to find templates
based on what's configured in the [`TEMPLATES`](/id/4.0/ref/settings/#std-setting-TEMPLATES) setting.

Using this renderer along with the built-in templates requires either:

- `'django.forms'` in [`INSTALLED_APPS`](/id/4.0/ref/settings/#std-setting-INSTALLED_APPS) dan setidaknya satu mesin dengan [`APP_DIRS=True`](/id/4.0/ref/settings/#std-setting-TEMPLATES-APP_DIRS).
- Adding the built-in templates directory in [`DIRS`](/id/4.0/ref/settings/#std-setting-TEMPLATES-DIRS)
  of one of your template engines. To generate that path:

  ```
  import django
  django.__path__[0] + '/forms/templates'  # or '/forms/jinja2'
  ```

Menggunakan pembangun ini membutuhkan anda untuk memastikan cetakan formulir proyek anda butuhkan dapat ditempatkan.

## Context available in formset templates

> **New in Django 4.0**

Formset templates receive a context from [`BaseFormSet.get_context()`](/id/4.0/topics/forms/formsets/#django.forms.formsets.BaseFormSet.get_context). By
default, formsets receive a dictionary with the following values:

- `formset`: The formset instance.

## Context available in form templates

> **New in Django 4.0**

Form templates receive a context from [`Form.get_context()`](/id/4.0/ref/forms/api/#django.forms.Form.get_context). By default,
forms receive a dictionary with the following values:

- `form`: The bound form.
- `fields`: All bound fields, except the hidden fields.
- `hidden_fields`: All hidden bound fields.
- `errors`: All non field related or hidden field related form errors.

## Konteks tersedia dalam cetakan widget

Cetakan widget menerima sebuah konteks dari [`Widget.get_context()`](/id/4.0/ref/forms/widgets/#django.forms.Widget.get_context). Secara awalan, widget menerima sebuah nilai tunggal dalam konteks, `widget`. Ini adalah sebuah dictionary yang mengandung nilai-nilai seperti:

- `name`
- `value`
- `attrs`
- `is_hidden`
- `template_name`

Beberapa widget menambah informasi lebih lanjut pada konteks. Sebagai contoh, semua widget yang subkelas `Input` menentukan `widget['type']` dan [`MultiWidget`](/id/4.0/ref/forms/widgets/#django.forms.MultiWidget) menentukan `widget['subwidgets']` untuk tujuan perulangan.

## Overriding built-in formset templates

> **New in Django 4.0**

[`BaseFormSet.template_name`](/id/4.0/topics/forms/formsets/#django.forms.formsets.BaseFormSet.template_name)

To override formset templates, you must use the [`TemplatesSetting`](#django.forms.renderers.TemplatesSetting)
renderer. Then overriding widget templates works [the same as](/id/4.0/howto/overriding-templates/) overriding any other template in your project.

## Overriding built-in form templates

> **New in Django 4.0**

[`Form.template_name`](/id/4.0/ref/forms/api/#django.forms.Form.template_name)

To override form templates, you must use the [`TemplatesSetting`](#django.forms.renderers.TemplatesSetting)
renderer. Then overriding widget templates works [the same as](/id/4.0/howto/overriding-templates/) overriding any other template in your project.

## Menimpa cetakan widget siap-pakai

Setiap widget mempunyai sebuah atribut `template_name` dengan sebuah nilai seperti `input.html`. Cetakan widget siap-pakai disimpan dalam jalur `django/forms/widgets`. Anda dapat menyediakan cetakan penyesuaian untuk `input.html` dengan menentukan `django/forms/widgets/input.html`, sebagai contoh. Lihat [Widget pasang tetap](/id/4.0/ref/forms/widgets/#built-in-widgets) untuk nama dari setiap cetakan widget.

Untuk menimpa cetakan widget, anda harus menggunakan pembangun [`TemplatesSetting`](#django.forms.renderers.TemplatesSetting). Kemudian menimpa cetakan widget bekerja [the same as](/id/4.0/howto/overriding-templates/) menimpa cetakan lain apapun dalam proyek anda.
