---
title: "Sinyal"
version: 3.0
locale: id
source: https://docs.djangoproject.com/id/3.0/ref/signals/
canonical: https://djangodocs.dev/id/3.0/ref/signals/
---
# Sinyal

Sebuah daftar dari semua sinyal yang Django kirim. Semua sinyal siap-pakai dikirim menggunakan metode [`send()`](/id/3.0/topics/signals/#django.dispatch.Signal.send).

> **See also**
>
> Lihat dokumentasi pada [signal dispatcher](/id/3.0/topics/signals/) untuk informasi menurut bagaimana mendaftarkan dan menerima sinyal.
>
> [authentication framework](/id/3.0/topics/auth/) mengirim [signals when a user is logged in / out](/id/3.0/ref/contrib/auth/#topics-auth-signals).

## Sinyal model

Modul [`django.db.models.signals`](#module-django.db.models.signals) menentukan sekumpulan sinyal dikirim oleh sistem model.

> **Warning**
>
> Banyak dari sinyal-sinyal ini dikirim oleh beragam metode model seperti `__init__()` atau [`save()`](/id/3.0/ref/models/instances/#django.db.models.Model.save) yang anda dapat timpa dalam kode anda sendiri.
>
> If you override these methods on your model, you must call the parent class'
> methods for these signals to be sent.
>
> Catat juga bahwa Django menyimpan penangan sinyal sebagai acuan lemah secara awalan, jadi jika penangan adalah sebauh fungsi lokal, itu mungkin sampah dikumpulkan. Untuk mencegah ini, `weak==False` ketika anda memanggil sinyal [`connect()`](/id/3.0/topics/signals/#django.dispatch.Signal.connect).

> **Note**
>
> Model signals `sender` model can be lazily referenced when connecting a
> receiver by specifying its full application label. For example, an
> `Question` model defined in the `polls` application could be referenced
> as `'polls.Question'`. This sort of reference can be quite handy when
> dealing with circular import dependencies and swappable models.

### `pre_init`

#### `django.db.models.signals.pre_init`

Whenever you instantiate a Django model, this signal is sent at the beginning
of the model's `__init__()` method.

Argumen dikirim dengan dinyal ini:

**`sender`**

  Kelas model yang baru mempunyai sebuah instance yang dibuat.

**`args`**

  A list of positional arguments passed to `__init__()`.

**`kwargs`**

  A dictionary of keyword arguments passed to `__init__()`.

For example, the [tutorial](/id/3.0/intro/tutorial02/) has this line:

```
q = Question(question_text="What's new?", pub_date=timezone.now())
```

Argumen dikirim ke penangan [`pre_init`](#django.db.models.signals.pre_init) akan berupa:

| Argument | Nilai |
| --- | --- |
| `sender` | `Question` (the class itself) |
| `args` | `[]` (an empty list because there were no positional<br>arguments passed to `__init__()`) |
| `kwargs` | `{'question_text': "What's new?",`<br>`'pub_date': datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)}` |

### `post_init`

#### `django.db.models.signals.post_init`

Seperti pre\_init, tetapi satu ini dikirim ketika metode `__init__()` selesai.

Argumen dikirim dengan dinyal ini:

**`sender`**

  Seperti diatas, kelas model yang baru mempunyai sebuah instance dibuat.

**`instance`**

  Instance sebenarnya dari model yang baru saja dibuat.

  > **Note**
  >
  > [`instance._state`](/id/3.0/ref/models/instances/#django.db.models.Model._state) isn't set
  > before sending the `post_init` signal, so `_state` attributes
  > always have their default values. For example, `_state.db` is
  > `None`.

> **Warning**
>
> For performance reasons, you shouldn't perform queries in receivers of
> `pre_init` or `post_init` signals because they would be executed for
> each instance returned during queryset iteration.

### `pre_save`

#### `django.db.models.signals.pre_save`

Ini dikirim pada awal dari metode [`save()`](/id/3.0/ref/models/instances/#django.db.models.Model.save) model.

Argumen dikirim dengan dinyal ini:

**`sender`**

  Kelas model.

**`instance`**

  Instance sebenarnya sedang disimpan.

**`raw`**

  A boolean; `True` if the model is saved exactly as presented
  (i.e. when loading a fixture). One should not query/modify other
  records in the database as the database might not be in a
  consistent state yet.

**`menggunakan`**

  Nama lain basisdata sedang digunakan.

**`update_fields`**

  Kumpulan dari bidang untuk memperbaharui seperti dilewatkan ke [`Model.save()`](/id/3.0/ref/models/instances/#django.db.models.Model.save), atau `None` jika `update_fields` tidak dilewatkan ke `save()`.

### `post_save`

#### `django.db.models.signals.post_save`

Seperti [`pre_save`](#django.db.models.signals.pre_save), tetapi dikirim pada akhir dari metode [`save()`](/id/3.0/ref/models/instances/#django.db.models.Model.save).

Argumen dikirim dengan dinyal ini:

**`sender`**

  Kelas model.

**`instance`**

  Instance sebenarnya sedang disimpan.

**`created`**

  Boolean; `True` jika sebuah rekaman baru telah dibuat.

**`raw`**

  A boolean; `True` if the model is saved exactly as presented
  (i.e. when loading a fixture). One should not query/modify other
  records in the database as the database might not be in a
  consistent state yet.

**`menggunakan`**

  Nama lain basisdata sedang digunakan.

**`update_fields`**

  Kumpulan dari bidang untuk memperbaharui seperti dilewatkan ke [`Model.save()`](/id/3.0/ref/models/instances/#django.db.models.Model.save), atau `None` jika `update_fields` tidak dilewatkan ke `save()`.

### `pre_delete`

#### `django.db.models.signals.pre_delete`

Dikirim pada awal dari metode [`delete()`](/id/3.0/ref/models/instances/#django.db.models.Model.delete) model dan  metode [`delete()`](/id/3.0/ref/models/querysets/#django.db.models.query.QuerySet.delete) queryset.

Argumen dikirim dengan dinyal ini:

**`sender`**

  Kelas model.

**`instance`**

  Instance sebenarnya sedang dihapus.

**`menggunakan`**

  Nama lain basisdata sedang digunakan.

### `post_delete`

#### `django.db.models.signals.post_delete`

Like [`pre_delete`](#django.db.models.signals.pre_delete), but sent at the end of a model's
[`delete()`](/id/3.0/ref/models/instances/#django.db.models.Model.delete) method and a queryset's
[`delete()`](/id/3.0/ref/models/querysets/#django.db.models.query.QuerySet.delete) method.

Argumen dikirim dengan dinyal ini:

**`sender`**

  Kelas model.

**`instance`**

  Instance sebenarnya sedang dihapus.

  Catat bahwa obyek tidak akan lagi berada dalam basisdata, jadi waspadalah apa yang anda lakukan dengan contoh ini.

**`menggunakan`**

  Nama lain basisdata sedang digunakan.

### `m2m_changed`

#### `django.db.models.signals.m2m_changed`

Dikirim ketika a [`ManyToManyField`](/id/3.0/ref/models/fields/#django.db.models.ManyToManyField) dirubah pada instance model. Berbicara dengan ketat, ini bukan sebuah sinyal model karena itu dikirim oleh [`ManyToManyField`](/id/3.0/ref/models/fields/#django.db.models.ManyToManyField), tetapi sejak itu melengkapi [`pre_save`](#django.db.models.signals.pre_save)/[`post_save`](#django.db.models.signals.post_save) dan [`pre_delete`](#django.db.models.signals.pre_delete)/[`post_delete`](#django.db.models.signals.post_delete) ketika itu datang untuk melacak perubahan pada model, itu disertakan disini.

Argumen dikirim dengan dinyal ini:

**`sender`**

  The intermediate model class describing the
  [`ManyToManyField`](/id/3.0/ref/models/fields/#django.db.models.ManyToManyField). This class is automatically
  created when a many-to-many field is defined; you can access it using the
  `through` attribute on the many-to-many field.

**`instance`**

  The instance whose many-to-many relation is updated. This can be an
  instance of the `sender`, or of the class the
  [`ManyToManyField`](/id/3.0/ref/models/fields/#django.db.models.ManyToManyField) is related to.

**`action`**

  Sebuah string menunjukkan jenis dari pembaharuan yang selesai pada hubungan. Ini dapat berupa satu dari berikut:

  **`"pre_add"`**

    Dikirim *sebelum* satu atau lebih obyek ditambahkan ke hubungan.

  **`"post_add"`**

    Dikirim *setelah* satu atau lebih obyek ditambahkan pada hubungan.

  **`"pre_remove"`**

    Dikirim *sebelum* satu atau lebih obyek dipindahkan dari hubungan.

  **`"post_remove"`**

    Dikirim *setelah* satu atau lebih obyek dipindahkan dari hubungan.

  **`"pre_clear"`**

    Dikirim *sebelum* hubungan dibersihkan.

  **`"post_clear"`**

    Dikirim\*setelah\* hubungan dibersihkan.

**`reverse`**

  Indicates which side of the relation is updated (i.e., if it is the
  forward or reverse relation that is being modified).

**`model`**

  Kelas dari obyek-byek yang ditambahkan juga, dipindahkan dari atau dibersihkan dari hubungan.

**`pk_set`**

  For the `pre_add` and `post_add` actions, this is a set of primary key
  values that will be, or have been, added to the relation. This may be a
  subset of the values submitted to be added, since inserts must filter
  existing values in order to avoid a database `IntegrityError`.

  For the `pre_remove` and `post_remove` actions, this is a set of
  primary key values that was submitted to be removed from the relation. This
  is not dependent on whether the values actually will be, or have been,
  removed. In particular, non-existent values may be submitted, and will
  appear in `pk_set`, even though they have no effect on the database.

  Untuk tindakan `pre_clear` dan `post_clear`, ini adalah `None`.

**`menggunakan`**

  Nama lain basisdata sedang digunakan.

Sebagai contoh, jika sebuah `Pizza` dapat memiliki banyak obyek `Topping`, dimodelkan seperti ini:

```
class Topping(models.Model):
    # ...
    pass

class Pizza(models.Model):
    # ...
    toppings = models.ManyToManyField(Topping)
```

Jika kami menghubungkan penangan seperti ini:

```
from django.db.models.signals import m2m_changed

def toppings_changed(sender, **kwargs):
    # Do something
    pass

m2m_changed.connect(toppings_changed, sender=Pizza.toppings.through)
```

dan kemudian lakukan sesuatu seperti ini:

```
>>> p = Pizza.objects.create(...)
>>> t = Topping.objects.create(...)
>>> p.toppings.add(t)
```

argumen-argumen dikirim ke penangan [`m2m_changed`](#django.db.models.signals.m2m_changed) (`toppings_changed` dalam contoh diatas) akan menjadi:

| Argument | Nilai |
| --- | --- |
| `sender` | `Pizza.toppings.through` (kelas m2m menengah) |
| `instance` | `p` (instance\`\`Pizza\`\` sedang dirubah) |
| `action` | `"pre_add"` (diikuti oleh sinyal terpisah dengan `"post_add"`) |
| `reverse` | `False` (`Pizza` contains the<br>[`ManyToManyField`](/id/3.0/ref/models/fields/#django.db.models.ManyToManyField), so this call<br>modifies the forward relation) |
| `model` | `Topping` (kelas dari obyek ditambahkan pada `Pizza`) |
| `pk_set` | `{t.id}` (sejak hanya `Topping t` yang ditambahkan ke hubungan) |
| `menggunakan` | `"default"` (sejak kiriman perute awalan ditulis disini) |

Dan jika kami akan kemudian melakukan seperti ini:

```
>>> t.pizza_set.remove(p)
```

argumen dikirim ke penangan [`m2m_changed`](#django.db.models.signals.m2m_changed) akan berupa:

| Argument | Nilai |
| --- | --- |
| `sender` | `Pizza.toppings.through` (kelas m2m menengah) |
| `instance` | `t` (instance `Topping` sedang dirubah) |
| `action` | `"pre_remove"` (diikuti oleh sinyal terpisah dengan `"post_remove"`) |
| `reverse` | `True` (`Pizza` mengandung [`ManyToManyField`](/id/3.0/ref/models/fields/#django.db.models.ManyToManyField), jadi panggilan ini merubah hubungan kebalikan) |
| `model` | `Pizza` (kelas dari obyek dipindahkan dari `Topping`) |
| `pk_set` | `{p.id}` (sejak hanya `Pizza p` telah dipindahkan dari hubungan) |
| `menggunakan` | `"default"` (sejak kiriman perute awalan ditulis disini) |

### `class_prepared`

#### `django.db.models.signals.class_prepared`

Sent whenever a model class has been "prepared" -- that is, once model has
been defined and registered with Django's model system. Django uses this
signal internally; it's not generally used in third-party applications.

Sejak sinyal ini dikirim selama pengolahan pengumpulan registrar aplikasi, dan [`AppConfig.ready()`](/id/3.0/ref/applications/#django.apps.AppConfig.ready) berjalan setelah registrar sepenuhnya dikumpulkan, penerima tidak dapat dihubungkan di metode itu. Satu kemungkinan adalah menghubungkan mereka `AppConfig.__init__()` sebagai gantinya, merawat tidak untuk mengimpor model atau panggilan pemicu pada registrar aplikasi.

Argumen-argumen yang dikirim dengan sinyal ini:

**`sender`**

  Kelas model yang telah dipersiapkan.

## Pengelolaan sinyal

Sinyal dikirim oleh [django-admin](/id/3.0/ref/django-admin/).

### `pre_migrate`

#### `django.db.models.signals.pre_migrate`

Sent by the [`migrate`](/id/3.0/ref/django-admin/#django-admin-migrate) command before it starts to install an
application. It's not emitted for applications that lack a `models` module.

Argumen dikirim dengan dinyal ini:

**`sender`**

  Sebuah instance [`AppConfig`](/id/3.0/ref/applications/#django.apps.AppConfig) untuk aplikasi tentang untuk dipindahkan/disinkronisasikan.

**`app_config`**

  Sama seperti `sender`.

**`verbosity`**

  Menunjukkan seberapa banyak informasi manage.py dicetak pada layar. Lihat bendera [`--verbosity`](/id/3.0/ref/django-admin/#cmdoption-verbosity) untuk rincian.

  Fungsi-fungsi yang mendengarkan untuk [`pre_migrate`](#django.db.models.signals.pre_migrate) harus menyesuaikan apa mereka keluarkan ke layar berdasarkan pada nilai dari argumen ini.

**`interactive`**

  If `interactive` is `True`, it's safe to prompt the user to input
  things on the command line. If `interactive` is `False`, functions
  which listen for this signal should not try to prompt for anything.

  Sebagai contoh, aplikasi [`django.contrib.auth`](/id/3.0/topics/auth/#module-django.contrib.auth) hanya menunjuk untuk membuat pengguna super ketika `interactive` adalah `True`.

**`menggunakan`**

  Nama lain dari basisdata dimana sebuah perintah akan beroperasi.

**`plan`**

  The migration plan that is going to be used for the migration run. While
  the plan is not public API, this allows for the rare cases when it is
  necessary to know the plan. A plan is a list of two-tuples with the first
  item being the instance of a migration class and the second item showing
  if the migration was rolled back (`True`) or applied (`False`).

**`apps`**

  Sebuah instance dari [`Apps`](/id/3.0/ref/applications/#module-django.apps) mengandung keadaan dari proyek sebelum perpindahan berjalan. Itu harus digunakan sebagai gantinya dari registrar [`apps`](/id/3.0/ref/applications/#django.apps.apps) global untuk mengambil model yang anda ingin lakukan tindakan.

### `post_migrate`

#### `django.db.models.signals.post_migrate`

Dikirim pada akhir dari [`migrate`](/id/3.0/ref/django-admin/#django-admin-migrate) (bahkan jika tidak ada perpindahan dijalankan) dan perintah [`flush`](/id/3.0/ref/django-admin/#django-admin-flush). Itu tidak dikeluarkan untuk aplikasi yang kekurangan modeul `models`.

Handlers of this signal must not perform database schema alterations as doing
so may cause the [`flush`](/id/3.0/ref/django-admin/#django-admin-flush) command to fail if it runs during the
[`migrate`](/id/3.0/ref/django-admin/#django-admin-migrate) command.

Argumen dikirim dengan dinyal ini:

**`sender`**

  Instance [`AppConfig`](/id/3.0/ref/applications/#django.apps.AppConfig) untuk aplikasi yang telah dipasang.

**`app_config`**

  Sama seperti `sender`.

**`verbosity`**

  Menunjukkan seberapa banyak informasi manage.py dicetak pada layar. Lihat bendera [`--verbosity`](/id/3.0/ref/django-admin/#cmdoption-verbosity) untuk rincian.

  Fungsi-fungsi yang mendengarkan untuk [`post_migrate`](#django.db.models.signals.post_migrate) harus menyesuaikan apa mereka keluarkan ke layar berdasarkan pada nilai dari argumen ini.

**`interactive`**

  If `interactive` is `True`, it's safe to prompt the user to input
  things on the command line. If `interactive` is `False`, functions
  which listen for this signal should not try to prompt for anything.

  Sebagai contoh, aplikasi [`django.contrib.auth`](/id/3.0/topics/auth/#module-django.contrib.auth) hanya menunjuk untuk membuat pengguna super ketika `interactive` adalah `True`.

**`menggunakan`**

  Nama lain basisdata digunakan untuk sinkronisasi. Awalan pada basisdata `default`.

**`plan`**

  The migration plan that was used for the migration run. While the plan is
  not public API, this allows for the rare cases when it is necessary to
  know the plan. A plan is a list of two-tuples with the first item being
  the instance of a migration class and the second item showing if the
  migration was rolled back (`True`) or applied (`False`).

**`apps`**

  Sebuah instance dari [`Apps`](/id/3.0/ref/applications/#module-django.apps) mengandung keadaan dari proyek setelah perpindahan berjalan. Itu harus digunakan sebagai gantinya dari registrar [`apps`](/id/3.0/ref/applications/#django.apps.apps) global untuk mengambil model yang anda ingin lakukan tindakan.

Sebagai contoh, anda dapat mendaftarkan sebuah callback dalam sebuah [`AppConfig`](/id/3.0/ref/applications/#django.apps.AppConfig) seperti ini:

```
from django.apps import AppConfig
from django.db.models.signals import post_migrate

def my_callback(sender, **kwargs):
    # Your specific logic here
    pass

class MyAppConfig(AppConfig):
    ...

    def ready(self):
        post_migrate.connect(my_callback, sender=self)
```

> **Note**
>
> If you provide an [`AppConfig`](/id/3.0/ref/applications/#django.apps.AppConfig) instance as the sender
> argument, please ensure that the signal is registered in
> [`ready()`](/id/3.0/ref/applications/#django.apps.AppConfig.ready). `AppConfig`s are recreated for
> tests that run with a modified set of [`INSTALLED_APPS`](/id/3.0/ref/settings/#std-setting-INSTALLED_APPS) (such as
> when settings are overridden) and such signals should be connected for each
> new `AppConfig` instance.

## Sinyal permintaan/tanggapan

Sinyal dikirim oleh kerangka kerja inti ketika mengolah sebuah permintaan.

### `request_started`

#### `django.core.signals.request_started`

Dikirim ketika Django mulai mengolah sebuah permintaan HTTP.

Argumen dikirim dengan dinyal ini:

**`sender`**

  Kelas penangan -- misalnya `django.core.handlers.wsgi.WsgiHandler` -- yang menangani permintaan.

**`environ`**

  Dictionary `environ` disediakan pada permintaan.

### `request_finished`

#### `django.core.signals.request_finished`

Dikirim ketika Django selesai mengirimkan sebuah tanggapan HTTP ke klien.

Argumen dikirim dengan dinyal ini:

**`sender`**

  Kelas penangan, seperti diatas.

### `got_request_exception`

#### `django.core.signals.got_request_exception`

Sinyal ini dikirim ketika Django menghadapi sebuah pengecualian selagi mengolah sebuah permintaan HTTP yang datang.

Argumen dikirim dengan dinyal ini:

**`sender`**

  Tidak digunakan (selalu `None`).

**`request`**

  Obyek [`HttpRequest`](/id/3.0/ref/request-response/#django.http.HttpRequest)

## Sinyal percobaan

Sinyal hanya dikirim ketika [running tests](/id/3.0/topics/testing/overview/#running-tests).

### `setting_changed`

#### `django.test.signals.setting_changed`

Sinyal dikirim ketika nilai dari pengaturan berubah melalui pengelola konteks `django.test.TestCase.settings()` atau pengelola penghias/konteks [`django.test.override_settings()`](/id/3.0/topics/testing/tools/#django.test.override_settings).

It's actually sent twice: when the new value is applied ("setup") and when the
original value is restored ("teardown"). Use the `enter` argument to
distinguish between the two.

Anda dapat juga mengimpor sinyal dari `django.core.signals` untuk menghindari impor dari `django.test` dalam keadaan bukan-percobaan.

Argumen dikirim dengan dinyal ini:

**`sender`**

  Penangan percobaan.

**`setting`**

  Nama dari pengaturan.

**`value`**

  Nilai dari pengaturan setelah berubah. Untuk pengaturan yang awalnya tidak ada, dalam fase "teardown", `value` adalah `None`.

**`enter`**

  Boolean; `True` jika pengaturan diberlakukan, `False` jika disimpan kembali.

### `template_rendered`

#### `django.test.signals.template_rendered`

Dikirim ketika sistem percobaan membangun sebuah cetakan. Siyal ini tidak dikeluarkan selama tindakan biasa dari peladen Django -- itu hanya tersedia selama percobaan.

Argumen dikirim dengan dinyal ini:

**`sender`**

  Obyek [`Template`](/id/3.0/ref/templates/api/#django.template.Template) yang dibangun.

**`template`**

  Sama seperti pengirim

**`context`**

  [`Context`](/id/3.0/ref/templates/api/#django.template.Context) dimana cetakan dibangun.

## Pembungkus Basisdata

Sinyal dikirim oleh pembungkus basisdata ketika hubungan basisdata dimulai.

### `connection_created`

#### `django.db.backends.signals.connection_created`

Sent when the database wrapper makes the initial connection to the
database.  This is particularly useful if you'd like to send any post
connection commands to the SQL backend.

Argumen dikirim dengan dinyal ini:

**`sender`**

  Kelas pembungkus basisdata -- yaitu. `django.db.backends.postgresql.DatabaseWrapper` atau `django.db.backends.mysql.DatabaseWrapper`, dll.

**`connection`**

  The database connection that was opened. This can be used in a
  multiple-database configuration to differentiate connection signals
  from different databases.
