{"title":"Tindakan admin","version":"6.1","locale":"id","docname":"ref/contrib/admin/actions","url":"/id/6.1/ref/contrib/admin/actions/","canonical":"https://djangodocs.dev/id/6.1/ref/contrib/admin/actions/","summary":"Alir kerja dasar dari admin Django adalah, dalam kulit kacang, \"pilih sebuah obyek, kemudian rubah itu.\" Ini bekerja baik untuk kebanyakan penggunaan kasus.…","html":"<h1>Tindakan admin<a class=\"heading-anchor\" href=\"#admin-actions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Alir kerja dasar dari admin Django adalah, dalam kulit kacang, &quot;pilih sebuah obyek, kemudian rubah itu.&quot; Ini bekerja baik untuk kebanyakan penggunaan kasus. Bagaimanapun, jika anda butuh perubahan sama ke banyak obyek sekali waktu, alir kerja ini bisa sangat membosankan.</p>\n<p>In these cases, Django's admin lets you write and register &quot;actions&quot; --\nfunctions that get called with a list of objects selected on the change list\npage.</p>\n<p>Jika anda mencari daftar perubahan apapun di admin, anda akan melihat fitur ini di tindakan; Django dikirim dengan tindakan &quot;menghapus obyek terpilih&quot; tersedia untuk semua model. Sebagai contoh, ini adalah modul pengguna dari aplikasi <a class=\"reference internal\" href=\"/id/6.1/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.auth</span></code></a> pasang-tetap Django :</p>\n<img alt=\"/id/6.1/_images/admin-actions.png\" src=\"/id/6.1/_images/admin-actions.png\" />\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Peringatan</p>\n<p>Tindakan &quot;hapus obyek-obyek terpilih&quot; menggunakan <a class=\"reference internal\" href=\"/id/6.1/ref/models/querysets/#django.db.models.query.QuerySet.delete\" title=\"django.db.models.query.QuerySet.delete\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.delete()</span></code></a> untuk alasan efesiensi, yang mempunyai surat keberatan yang penting: metode <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> model anda tidak akan dipanggil.</p>\n<p>Jika anda berharap menimpa perilaku ini, anda dapat menimpa <a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.delete_queryset\" title=\"django.contrib.admin.ModelAdmin.delete_queryset\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ModelAdmin.delete_queryset()</span></code></a> atau menulis penyesuaian tindakan yang melakukan penghapusan dalam perilaku anda pilih -- sebagai contoh, dengan memanggil <code class=\"docutils literal notranslate\"><span class=\"pre\">Model.delete()</span></code> untuk setiap dari barang terpilih.</p>\n<p>Untuk latar belakang lebih pada penghapusan jumlah besar, lihat dokumentasi pada <a class=\"reference internal\" href=\"/id/6.1/topics/db/queries/#topics-db-queries-delete\"><span class=\"std std-ref\">object deletion</span></a>.</p>\n</aside>\n<p>Baca untuk menemukan bagaimana menambah tindakan anda sendiri ke daftar ini.</p>\n<section id=\"writing-actions\">\n<h2>Menulis tindakan<a class=\"heading-anchor\" href=\"#writing-actions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Cara mudah untukmenjelaskan tindakan adalah dengan contoh, jadi mari kita selami.</p>\n<p>A common use case for admin actions is the bulk updating of a model. Imagine a\nnews application with an <code class=\"docutils literal notranslate\"><span class=\"pre\">Article</span></code> model:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"n\">STATUS_CHOICES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;d&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Draft&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;p&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Published&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;w&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Withdrawn&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">body</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextField</span><span class=\"p\">()</span>\n    <span class=\"n\">status</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">choices</span><span class=\"o\">=</span><span class=\"n\">STATUS_CHOICES</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">title</span>\n</code></pre></div>\n<p>Tugas utama kami mungkin lakukan dengan sebuah model seperti ini adalah memperbaharui sebuah keadaan article dari &quot;draft&quot; menjadi &quot;published&quot;. Kami dapat dengan mudah melakukan ini di admin satu artikel pada sekali waktu, tetapi jika kami ingin menerbitkan-jumlah besar kelompok dari artikel, itu akan membosankan. Jadi, mari kita menulis sebuah tindakan yang membuat kita merubah sebuah keadaan artikel menjadi &quot;published.&quot;</p>\n<section id=\"writing-action-functions\">\n<span id=\"action-function\"></span><h3>Menulis fungsi tindakan<a class=\"heading-anchor\" href=\"#writing-action-functions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>First, we'll need to write a function that gets called when the action is\ntriggered from the admin. Action functions are regular functions that take\nthree arguments:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a> saat ini</p></li>\n<li><p>Sebuah <a class=\"reference internal\" href=\"/id/6.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> mewakili permintaan saat ini,</p></li>\n<li><p>Sebuah <a class=\"reference internal\" href=\"/id/6.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> mengandung sekumpulan dari obyek-obyek terpilih oleh pengguna.</p></li>\n</ul>\n<p>Fungsi terbitan-artikel-ini kami tidak butuh <a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a> atau obyek permintaan, tetapi kami akan menggunakan queryset:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"n\">modeladmin</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>For the best performance, we're using the queryset's <a class=\"reference internal\" href=\"/id/6.1/topics/db/queries/#topics-db-queries-update\"><span class=\"std std-ref\">update method</span></a>. Other types of actions might need to deal\nwith each object individually; in these cases we'd iterate over the\nqueryset:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">for</span> <span class=\"n\">obj</span> <span class=\"ow\">in</span> <span class=\"n\">queryset</span><span class=\"p\">:</span>\n    <span class=\"n\">do_something_with</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n<p>That's actually all there is to writing an action! However, we'll take one\nmore optional-but-useful step and give the action a &quot;nice&quot; title in the admin.\nBy default, this action would appear in the action list as &quot;Make published&quot; --\nthe function name, with underscores replaced by spaces. That's fine, but we\ncan provide a better, more human-friendly name by using the\n<a class=\"reference internal\" href=\"#django.contrib.admin.action\" title=\"django.contrib.admin.action\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">action()</span></code></a> decorator on the <code class=\"docutils literal notranslate\"><span class=\"pre\">make_published</span></code>\nfunction:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"o\">...</span>\n\n\n<span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span><span class=\"p\">(</span><span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s2\">&quot;Mark selected stories as published&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"n\">modeladmin</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>This might look familiar; the admin's\n<a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">list_display</span></code></a> option uses a similar\ntechnique with the <a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.display\" title=\"django.contrib.admin.display\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">display()</span></code></a> decorator to\nprovide human-readable descriptions for callback functions registered\nthere, too.</p>\n</aside>\n</section>\n<section id=\"adding-actions-to-the-modeladmin\">\n<h3>Menambahkan tindakan pada <a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a><a class=\"heading-anchor\" href=\"#adding-actions-to-the-modeladmin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Selanjutnya, kami akan butuh menginformasikan <a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a> kami dari tindakan. Ini bekerja seperti piliha konfigurasi lain apapun. Jadi, <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.py</span></code> lengkap dengan tindakan dan pendaftarannya akan terlihat seperti:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Article</span>\n\n\n<span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span><span class=\"p\">(</span><span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s2\">&quot;Mark selected stories as published&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"n\">modeladmin</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">list_display</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;status&quot;</span><span class=\"p\">]</span>\n    <span class=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">]</span>\n    <span class=\"n\">actions</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">make_published</span><span class=\"p\">]</span>\n\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">Article</span><span class=\"p\">,</span> <span class=\"n\">ArticleAdmin</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Kode akan memberikan kami sebuah daftar rubah admin yang terlihat sesuatu seperti ini:</p>\n<img alt=\"/id/6.1/_images/adding-actions-to-the-modeladmin.png\" src=\"/id/6.1/_images/adding-actions-to-the-modeladmin.png\" />\n<p>That's really all there is to it! If you're itching to write your own actions,\nyou now know enough to get started. The rest of this document covers more\nadvanced techniques.</p>\n</section>\n<section id=\"handling-errors-in-actions\">\n<h3>Penanganan kesalahan di tindakan<a class=\"heading-anchor\" href=\"#handling-errors-in-actions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Jika ada kondisi kesalahan mendatang yang mungkin muncul selagi menjalankan tindakan anda, anda harus anggun menginformasikan pengguna dari masalah. Ini berarti menangani pengecualian dan menggunakan <a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.message_user\" title=\"django.contrib.admin.ModelAdmin.message_user\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">django.contrib.admin.ModelAdmin.message_user()</span></code></a> untuk memperlihatkan gambaran yang ramah pengguna dari masalah di tanggapan.</p>\n</section>\n</section>\n<section id=\"advanced-action-techniques\">\n<h2>Teknik-teknik tindakan lanjutan<a class=\"heading-anchor\" href=\"#advanced-action-techniques\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ada sepasang pilihan tambahan dan kemungkinan anda dapat menggunakan lebih pilihan  lanjutan</p>\n<section id=\"actions-as-modeladmin-methods\">\n<h3>Tindakan sebagai metode <a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a><a class=\"heading-anchor\" href=\"#actions-as-modeladmin-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The example above shows the <code class=\"docutils literal notranslate\"><span class=\"pre\">make_published</span></code> action defined as a function.\nThat's perfectly fine, but it's not perfect from a code design point of view:\nsince the action is tightly coupled to the <code class=\"docutils literal notranslate\"><span class=\"pre\">Article</span></code> object, it makes sense\nto hook the action to the <code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleAdmin</span></code> object itself.</p>\n<p>Anda dapat melakukan itu seperti ini:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"n\">actions</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;make_published&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span><span class=\"p\">(</span><span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s2\">&quot;Mark selected stories as published&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n        <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Perhatikan pertama yang kami telah pindahkan <code class=\"docutils literal notranslate\"><span class=\"pre\">make_published</span></code> kedalam metode dan dinamai kembali parameter <code class=\"docutils literal notranslate\"><span class=\"pre\">modeladmin</span></code> pada <code class=\"docutils literal notranslate\"><span class=\"pre\">self</span></code>, dan kedua kami telah sekarang menaruh string <code class=\"docutils literal notranslate\"><span class=\"pre\">'make_published'</span></code> dalam <code class=\"docutils literal notranslate\"><span class=\"pre\">actions</span></code> daripada acuan fungsi langsung. Ini mengatakan <a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a> untuk mencari tindakan sebagai sebuah metode.</p>\n<p>Defining actions as methods gives the action more idiomatic access to the\n<a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a> itself, allowing the action to call any of the methods\nprovided by the admin.</p>\n<p id=\"custom-admin-action\">For example, we can use <code class=\"docutils literal notranslate\"><span class=\"pre\">self</span></code> to flash a message to the user informing them\nthat the action was successful:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">messages</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ngettext</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n        <span class=\"n\">updated</span> <span class=\"o\">=</span> <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">message_user</span><span class=\"p\">(</span>\n            <span class=\"n\">request</span><span class=\"p\">,</span>\n            <span class=\"n\">ngettext</span><span class=\"p\">(</span>\n                <span class=\"s2\">&quot;</span><span class=\"si\">%d</span><span class=\"s2\"> story was successfully marked as published.&quot;</span><span class=\"p\">,</span>\n                <span class=\"s2\">&quot;</span><span class=\"si\">%d</span><span class=\"s2\"> stories were successfully marked as published.&quot;</span><span class=\"p\">,</span>\n                <span class=\"n\">updated</span><span class=\"p\">,</span>\n            <span class=\"p\">)</span>\n            <span class=\"o\">%</span> <span class=\"n\">updated</span><span class=\"p\">,</span>\n            <span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">SUCCESS</span><span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n</code></pre></div>\n<p>This makes the action match what the admin itself does after successfully\nperforming an action:</p>\n<img alt=\"/id/6.1/_images/actions-as-modeladmin-methods.png\" src=\"/id/6.1/_images/actions-as-modeladmin-methods.png\" />\n</section>\n<section id=\"actions-that-provide-intermediate-pages\">\n<h3>Tindakan yang menyediakan halaman menengah<a class=\"heading-anchor\" href=\"#actions-that-provide-intermediate-pages\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>By default, after an action is performed the user is redirected back to the\noriginal change list page. However, some actions, especially more complex ones,\nwill need to return intermediate pages. For example, the built-in delete action\nasks for confirmation before deleting the selected objects.</p>\n<p>To provide an intermediary page, return an <a class=\"reference internal\" href=\"/id/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>\n(or subclass) from your action. For example, you might write an export function\nthat uses Django's <a class=\"reference internal\" href=\"/id/6.1/topics/serialization/\"><span class=\"doc\">serialization functions</span></a> to\ndump some selected objects as JSON:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">serializers</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">export_as_json</span><span class=\"p\">(</span><span class=\"n\">modeladmin</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">content_type</span><span class=\"o\">=</span><span class=\"s2\">&quot;application/json&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">serializers</span><span class=\"o\">.</span><span class=\"n\">serialize</span><span class=\"p\">(</span><span class=\"s2\">&quot;json&quot;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">,</span> <span class=\"n\">stream</span><span class=\"o\">=</span><span class=\"n\">response</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n<p>Generally, something like the above isn't considered a great idea. Most of the\ntime, the best practice will be to return an\n<a class=\"reference internal\" href=\"/id/6.1/ref/request-response/#django.http.HttpResponseRedirect\" title=\"django.http.HttpResponseRedirect\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponseRedirect</span></code></a> and redirect the user to a view\nyou've written, passing the list of selected objects in the GET query string.\nThis allows you to provide complex interaction logic on the intermediary\npages. For example, if you wanted to provide a more complete export function,\nyou'd want to let the user choose a format, and possibly a list of fields to\ninclude in the export. The best thing to do would be to write a small action\nthat redirects to your custom export view:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.contenttypes.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ContentType</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponseRedirect</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">export_selected_objects</span><span class=\"p\">(</span><span class=\"n\">modeladmin</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">selected</span> <span class=\"o\">=</span> <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">,</span> <span class=\"n\">flat</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">ct</span> <span class=\"o\">=</span> <span class=\"n\">ContentType</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_for_model</span><span class=\"p\">(</span><span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponseRedirect</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;/export/?ct=</span><span class=\"si\">%s</span><span class=\"s2\">&amp;ids=</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span>\n        <span class=\"o\">%</span> <span class=\"p\">(</span>\n            <span class=\"n\">ct</span><span class=\"o\">.</span><span class=\"n\">pk</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;,&quot;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">pk</span> <span class=\"ow\">in</span> <span class=\"n\">selected</span><span class=\"p\">),</span>\n        <span class=\"p\">)</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p>As you can see, the action is rather short; all the complex logic would belong\nin your export view. This would need to deal with objects of any type, hence\nthe business with the <code class=\"docutils literal notranslate\"><span class=\"pre\">ContentType</span></code>.</p>\n<p>Meunlis tampilan ini adalah sisa dari sebuah latihan ke pembaca.</p>\n</section>\n<section id=\"making-actions-available-site-wide\">\n<span id=\"adminsite-actions\"></span><h3>Membuat tindakan tersedia lebar-situs<a class=\"heading-anchor\" href=\"#making-actions-available-site-wide\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.add_action\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">AdminSite.</span></span><span class=\"sig-name descname\"><span class=\"pre\">add_action</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">action</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.add_action\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Some actions are best if they're made available to <em>any</em> object in the\nadmin site -- the export action defined above would be a good candidate.\nYou can make an action globally available using\n<a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.add_action\" title=\"django.contrib.admin.AdminSite.add_action\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">AdminSite.add_action()</span></code></a>. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">add_action</span><span class=\"p\">(</span><span class=\"n\">export_selected_objects</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>This makes the <code class=\"docutils literal notranslate\"><span class=\"pre\">export_selected_objects</span></code> action globally available as an\naction named &quot;export_selected_objects&quot;. You can explicitly give the action\na name -- good if you later want to programmatically <a class=\"reference internal\" href=\"#disabling-admin-actions\"><span class=\"std std-ref\">remove the\naction</span></a> -- by passing a second argument to\n<a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.add_action\" title=\"django.contrib.admin.AdminSite.add_action\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">AdminSite.add_action()</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">add_action</span><span class=\"p\">(</span><span class=\"n\">export_selected_objects</span><span class=\"p\">,</span> <span class=\"s2\">&quot;export_selected&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n<section id=\"disabling-actions\">\n<span id=\"disabling-admin-actions\"></span><h3>Meniadakan tindakan<a class=\"heading-anchor\" href=\"#disabling-actions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Terkadang anda butuh meniadakan beberapa tindakan -- khususnya itu <a class=\"reference internal\" href=\"#adminsite-actions\"><span class=\"std std-ref\">registered site-wide</span></a> -- untuk obyek-obyek tertentu. Ada sedikit cara anda dapat meniadakan tindakan:</p>\n<section id=\"disabling-a-site-wide-action\">\n<h4>Meniadakan tindakan lebar-situs<a class=\"heading-anchor\" href=\"#disabling-a-site-wide-action\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.disable_action\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">AdminSite.</span></span><span class=\"sig-name descname\"><span class=\"pre\">disable_action</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.disable_action\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>If you need to disable a <a class=\"reference internal\" href=\"#adminsite-actions\"><span class=\"std std-ref\">site-wide action</span></a> you\ncan call <a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.disable_action\" title=\"django.contrib.admin.AdminSite.disable_action\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">AdminSite.disable_action()</span></code></a>.</p>\n<p>Sebagai contoh, anda dapat menggunakan metode ini memindahkan tindakan &quot;delete selected objects&quot; siap-pakai:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">disable_action</span><span class=\"p\">(</span><span class=\"s2\">&quot;delete_selected&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Sekali anda telah melakukan diatas, tindakan itu akan tidak lagi tersedia lebar-situs.</p>\n<p>If, however, you need to reenable a globally-disabled action for one\nparticular model, list it explicitly in your <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelAdmin.actions</span></code> list:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Globally disable delete selected</span>\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">disable_action</span><span class=\"p\">(</span><span class=\"s2\">&quot;delete_selected&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"c1\"># This ModelAdmin will not have delete_selected available</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SomeModelAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">actions</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;some_other_action&quot;</span><span class=\"p\">]</span>\n    <span class=\"o\">...</span>\n\n\n<span class=\"c1\"># This one will</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AnotherModelAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">actions</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;delete_selected&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;a_third_action&quot;</span><span class=\"p\">]</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n<section id=\"disabling-all-actions-for-a-particular-modeladmin\">\n<h4>Meniadakan semua tindakan untuk <a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a> tertentu<a class=\"heading-anchor\" href=\"#disabling-all-actions-for-a-particular-modeladmin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>If you want <em>no</em> bulk actions available for a given <a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a>, set\n<a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.actions\" title=\"django.contrib.admin.ModelAdmin.actions\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">ModelAdmin.actions</span></code></a> to <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">actions</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n</code></pre></div>\n<p>Ini memberitahu <a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a> untuk tidak memperlihatkan atau mengizinkan tindakan apapun, termasuk <a class=\"reference internal\" href=\"#adminsite-actions\"><span class=\"std std-ref\">site-wide actions</span></a> apapun.</p>\n</section>\n<section id=\"conditionally-enabling-or-disabling-actions\">\n<h4>Tindakan mengadakan dan meniadakan bersyarat<a class=\"heading-anchor\" href=\"#conditionally-enabling-or-disabling-actions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_actions\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">ModelAdmin.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_actions</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">action_location</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">ActionLocation.CHANGE_LIST</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_actions\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Akhirnya, anda dapat secara kondisional mengadakan atau meniadakan tindakan-tindakan pada sebuah per-permintaan (dan karenanya berdasarkan per-pengguna) dengan mengutamakan <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_actions\" title=\"django.contrib.admin.ModelAdmin.get_actions\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ModelAdmin.get_actions()</span></code></a>.</p>\n<p>This returns a dictionary of actions allowed for the specific\n<code class=\"docutils literal notranslate\"><span class=\"pre\">action_location</span></code>. The keys are action names, and the values are\n<a class=\"reference internal\" href=\"#django.contrib.admin.Action\" title=\"django.contrib.admin.Action\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Action</span></code></a> objects.</p>\n<p>Sebagai contoh, jika anda hanya ingin pengguna yang namanya dimulai dengan 'J' untuk dapat menghapus obyek-pbyek dalam jumlah besar:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_actions</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">action_location</span><span class=\"o\">=</span><span class=\"n\">ActionLocation</span><span class=\"o\">.</span><span class=\"n\">CHANGE_LIST</span><span class=\"p\">):</span>\n        <span class=\"n\">actions</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_actions</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">action_location</span><span class=\"o\">=</span><span class=\"n\">action_location</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">username</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">()</span> <span class=\"o\">!=</span> <span class=\"s2\">&quot;J&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">if</span> <span class=\"s2\">&quot;delete_selected&quot;</span> <span class=\"ow\">in</span> <span class=\"n\">actions</span><span class=\"p\">:</span>\n                <span class=\"k\">del</span> <span class=\"n\">actions</span><span class=\"p\">[</span><span class=\"s2\">&quot;delete_selected&quot;</span><span class=\"p\">]</span>\n        <span class=\"k\">return</span> <span class=\"n\">actions</span>\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"6.1\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p>The keyword argument <code class=\"docutils literal notranslate\"><span class=\"pre\">action_location</span></code> was added. The return type was\nchanged to a dictionary where the keys are action names and the values\nare <a class=\"reference internal\" href=\"#django.contrib.admin.Action\" title=\"django.contrib.admin.Action\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Action</span></code></a> objects, previously the values were\n<code class=\"docutils literal notranslate\"><span class=\"pre\">(function,</span> <span class=\"pre\">name,</span> <span class=\"pre\">description)</span></code> tuples.</p>\n</aside>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"setting-permissions-for-actions\">\n<span id=\"admin-action-permissions\"></span><h3>Pengaturan perizinan untuk tindakan<a class=\"heading-anchor\" href=\"#setting-permissions-for-actions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Actions may limit their availability to users with specific permissions by\nwrapping the action function with the <a class=\"reference internal\" href=\"#django.contrib.admin.action\" title=\"django.contrib.admin.action\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">action()</span></code></a>\ndecorator and passing the <code class=\"docutils literal notranslate\"><span class=\"pre\">permissions</span></code> argument:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span><span class=\"p\">(</span><span class=\"n\">permissions</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;change&quot;</span><span class=\"p\">])</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"n\">modeladmin</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Tindakan <code class=\"docutils literal notranslate\"><span class=\"pre\">make_published()</span></code> hanya akan tersedia pada pengguna yang melewatkan pemeriksaan <a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_change_permission\" title=\"django.contrib.admin.ModelAdmin.has_change_permission\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ModelAdmin.has_change_permission()</span></code></a>.</p>\n<p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">permissions</span></code> has more than one permission, the action will be available\nas long as the user passes at least one of the checks.</p>\n<p>Available values for <code class=\"docutils literal notranslate\"><span class=\"pre\">permissions</span></code> and the corresponding method checks are:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'add'</span></code>: <a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_add_permission\" title=\"django.contrib.admin.ModelAdmin.has_add_permission\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ModelAdmin.has_add_permission()</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'change'</span></code>: <a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_change_permission\" title=\"django.contrib.admin.ModelAdmin.has_change_permission\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ModelAdmin.has_change_permission()</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'delete'</span></code>: <a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_delete_permission\" title=\"django.contrib.admin.ModelAdmin.has_delete_permission\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ModelAdmin.has_delete_permission()</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'view'</span></code>: <a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_view_permission\" title=\"django.contrib.admin.ModelAdmin.has_view_permission\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ModelAdmin.has_view_permission()</span></code></a></p></li>\n</ul>\n<p>Anda dapat menentukan nilai lain apapun selama anda menerapkan metode  <code class=\"docutils literal notranslate\"><span class=\"pre\">has__permission(self,</span> <span class=\"pre\">request)</span></code> sesuai pada <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code>.</p>\n<p>Sebagai contoh:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">get_permission_codename</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">actions</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;make_published&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span><span class=\"p\">(</span><span class=\"n\">permissions</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;publish&quot;</span><span class=\"p\">])</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n        <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">has_publish_permission</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;Does the user have the publish permission?&quot;&quot;&quot;</span>\n        <span class=\"n\">opts</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">opts</span>\n        <span class=\"n\">codename</span> <span class=\"o\">=</span> <span class=\"n\">get_permission_codename</span><span class=\"p\">(</span><span class=\"s2\">&quot;publish&quot;</span><span class=\"p\">,</span> <span class=\"n\">opts</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">has_perm</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">.</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"n\">opts</span><span class=\"o\">.</span><span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">codename</span><span class=\"p\">))</span>\n</code></pre></div>\n<section id=\"controlling-where-actions-are-available\">\n<span id=\"admin-action-availability\"></span><h4>Controlling where actions are available<a class=\"heading-anchor\" href=\"#controlling-where-actions-are-available\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<aside class=\"version-note version-added\" data-version=\"6.1\">\n<p class=\"version-note-title\">New in Django 6.1</p></aside>\n<p>By default, admin actions are available on the change list page only. You can\ncontrol where an action appears using the <code class=\"docutils literal notranslate\"><span class=\"pre\">location</span></code> argument of the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&#64;admin.action</span></code> decorator.</p>\n<p>For example, to make an action available only on the change form, set\n<code class=\"docutils literal notranslate\"><span class=\"pre\">location</span></code> to <a class=\"reference internal\" href=\"#django.contrib.admin.ActionLocation.CHANGE_FORM\" title=\"django.contrib.admin.ActionLocation.CHANGE_FORM\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">ActionLocation.CHANGE_FORM</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.admin</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ActionLocation</span>\n\n\n<span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span><span class=\"p\">(</span><span class=\"n\">location</span><span class=\"o\">=</span><span class=\"n\">ActionLocation</span><span class=\"o\">.</span><span class=\"n\">CHANGE_FORM</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"n\">modeladmin</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>To make an action available on both the change list and the change form:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span><span class=\"p\">(</span>\n    <span class=\"n\">location</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"n\">ActionLocation</span><span class=\"o\">.</span><span class=\"n\">CHANGE_FORM</span><span class=\"p\">,</span> <span class=\"n\">ActionLocation</span><span class=\"o\">.</span><span class=\"n\">CHANGE_LIST</span><span class=\"p\">],</span>\n    <span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s2\">&quot;Publish&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">description_plural</span><span class=\"o\">=</span><span class=\"s2\">&quot;Mark selected stories as published&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"n\">modeladmin</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>Notice that <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">description_plural</span></code> were provided. These are\noptional but the admin action will be labeled by <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> in the admin\nchange form and <code class=\"docutils literal notranslate\"><span class=\"pre\">description_plural</span></code> in the admin change list.</p>\n<p>You can customize how actions are rendered by overriding admin templates.\nThe change list page uses <code class=\"docutils literal notranslate\"><span class=\"pre\">admin/actions.html</span></code> and the change form page uses\n<code class=\"docutils literal notranslate\"><span class=\"pre\">admin/change_form_actions.html</span></code>. Note that the change form template inherits\nfrom the change list actions template.</p>\n</section>\n</section>\n</section>\n<section id=\"the-action-decorator\">\n<h2>The <code class=\"docutils literal notranslate\"><span class=\"pre\">action</span></code> decorator<a class=\"heading-anchor\" href=\"#the-action-decorator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.action\">\n<span class=\"sig-name descname\"><span class=\"pre\">action</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\"><span class=\"pre\">*</span></abbr></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">permissions</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">description</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">description_plural</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">location</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">ActionLocation.CHANGE_LIST</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.action\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>This decorator can be used for setting specific attributes on custom action\nfunctions that can be used with\n<a class=\"reference internal\" href=\"/id/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.actions\" title=\"django.contrib.admin.ModelAdmin.actions\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">actions</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span><span class=\"p\">(</span>\n    <span class=\"n\">permissions</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;publish&quot;</span><span class=\"p\">],</span>\n    <span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s2\">&quot;Mark selected stories as published&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>This is equivalent to setting some attributes (with the original, longer\nnames) on the function directly:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"n\">make_published</span><span class=\"o\">.</span><span class=\"n\">allowed_permissions</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;publish&quot;</span><span class=\"p\">]</span>\n<span class=\"n\">make_published</span><span class=\"o\">.</span><span class=\"n\">short_description</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Mark selected stories as published&quot;</span>\n</code></pre></div>\n<p>Use of this decorator is not compulsory to make an action function, but it\ncan be useful to use it without arguments as a marker in your source to\nidentify the purpose of the function:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_inactive</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">is_active</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>In this case it will add no attributes to the function.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameter<span class=\"colon\">:</span></dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>permissions</strong> -- A list of permission codenames that restrict the action\nto users who have at least one of the defined permissions. This sets\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">allowed_permissions</span></code> attribute on the function. See\n<a class=\"reference internal\" href=\"#admin-action-permissions\"><span class=\"std std-ref\">Pengaturan perizinan untuk tindakan</span></a> for details.</p></li>\n<li><p><strong>description</strong> -- A human-readable description of the action to be\nrendered in the admin. If <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> is not provided, Django\nrenders the function's name, converting underscores to spaces and\ncapitalizing the first letter of the first word. This sets the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">short_description</span></code> attribute on the function.</p></li>\n<li><p><strong>description_plural</strong> -- A human-readable description of the action used\nin contexts where plural wording is required, such as on the admin\nchange list. If <code class=\"docutils literal notranslate\"><span class=\"pre\">description_plural</span></code> is not provided, falls back to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code>. This sets the <code class=\"docutils literal notranslate\"><span class=\"pre\">plural_description</span></code> attribute on the\nfunction.</p></li>\n<li><p><strong>location</strong> -- Specifies where the action is available. Accepts either a\nsingle <a class=\"reference internal\" href=\"#django.contrib.admin.ActionLocation\" title=\"django.contrib.admin.ActionLocation\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ActionLocation</span></code></a> value or an iterable of values. If\nomitted, the action is only available on the admin change list. See\n<a class=\"reference internal\" href=\"#admin-action-availability\"><span class=\"std std-ref\">Controlling where actions are available</span></a> for details.</p></li>\n</ul>\n</dd>\n</dl>\n<aside class=\"admonition-action-description-formatting-support admonition\">\n<p class=\"admonition-title\">Action description <code class=\"docutils literal notranslate\"><span class=\"pre\">%</span></code>-formatting support</p>\n<p>Action descriptions support <code class=\"docutils literal notranslate\"><span class=\"pre\">%</span></code>-formatting and may include\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'%(verbose_name)s'</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">'%(verbose_name_plural)s'</span></code> placeholders.\nThese are replaced with the model’s\n<a class=\"reference internal\" href=\"/id/6.1/ref/models/options/#django.db.models.Options.verbose_name\" title=\"django.db.models.Options.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code></a> and\n<a class=\"reference internal\" href=\"/id/6.1/ref/models/options/#django.db.models.Options.verbose_name_plural\" title=\"django.db.models.Options.verbose_name_plural\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">verbose_name_plural</span></code></a>.</p>\n</aside>\n<aside class=\"version-note version-changed\" data-version=\"6.1\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p>The keyword arguments <code class=\"docutils literal notranslate\"><span class=\"pre\">description_plural</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">location</span></code> were\nadded.</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"actionlocation\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">ActionLocation</span></code><a class=\"heading-anchor\" href=\"#actionlocation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"version-note version-added\" data-version=\"6.1\">\n<p class=\"version-note-title\">New in Django 6.1</p></aside>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ActionLocation\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">ActionLocation</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ActionLocation\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Enum of allowed values for the <code class=\"docutils literal notranslate\"><span class=\"pre\">location</span></code> parameter of the\n<a class=\"reference internal\" href=\"#django.contrib.admin.action\" title=\"django.contrib.admin.action\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">action()</span></code></a> decorator.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ActionLocation.CHANGE_FORM\">\n<span class=\"sig-name descname\"><span class=\"pre\">CHANGE_FORM</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ActionLocation.CHANGE_FORM\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The action is available on the admin change form. When an action is run,\nany unsaved changes on the admin change form will be lost.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ActionLocation.CHANGE_LIST\">\n<span class=\"sig-name descname\"><span class=\"pre\">CHANGE_LIST</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ActionLocation.CHANGE_LIST\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The action is available on the admin change list.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"action\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">Action</span></code><a class=\"heading-anchor\" href=\"#action\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"version-note version-added\" data-version=\"6.1\">\n<p class=\"version-note-title\">New in Django 6.1</p></aside>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.Action\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Action</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.Action\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Represents an action. Actions should be defined using the <a class=\"reference internal\" href=\"#django.contrib.admin.action\" title=\"django.contrib.admin.action\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">action()</span></code></a>\ndecorator.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.Action.func\">\n<span class=\"sig-name descname\"><span class=\"pre\">func</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.Action.func\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The action function. See <a class=\"reference internal\" href=\"#action-function\"><span class=\"std std-ref\">Menulis fungsi tindakan</span></a> for details.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.Action.name\">\n<span class=\"sig-name descname\"><span class=\"pre\">name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.Action.name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The action function name.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.Action.description\">\n<span class=\"sig-name descname\"><span class=\"pre\">description</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.Action.description\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A human-readable description of the action to be rendered in the admin.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.Action.plural_description\">\n<span class=\"sig-name descname\"><span class=\"pre\">plural_description</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.Action.plural_description\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A human-readable description of the action used in contexts where\nplural wording is required.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.Action.locations\">\n<span class=\"sig-name descname\"><span class=\"pre\">locations</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.Action.locations\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A list of <a class=\"reference internal\" href=\"#django.contrib.admin.ActionLocation\" title=\"django.contrib.admin.ActionLocation\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ActionLocation</span></code></a> values the admin action can be\nrendered.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>","rootId":"admin-actions","toc":[{"title":"Menulis tindakan","anchor":"writing-actions","children":[{"title":"Menulis fungsi tindakan","anchor":"writing-action-functions","children":[]},{"title":"Menambahkan tindakan pada ModelAdmin","anchor":"adding-actions-to-the-modeladmin","children":[]},{"title":"Penanganan kesalahan di tindakan","anchor":"handling-errors-in-actions","children":[]}]},{"title":"Teknik-teknik tindakan lanjutan","anchor":"advanced-action-techniques","children":[{"title":"Tindakan sebagai metode ModelAdmin","anchor":"actions-as-modeladmin-methods","children":[]},{"title":"Tindakan yang menyediakan halaman menengah","anchor":"actions-that-provide-intermediate-pages","children":[]},{"title":"Membuat tindakan tersedia lebar-situs","anchor":"making-actions-available-site-wide","children":[]},{"title":"Meniadakan tindakan","anchor":"disabling-actions","children":[{"title":"Meniadakan tindakan lebar-situs","anchor":"disabling-a-site-wide-action","children":[]},{"title":"Meniadakan semua tindakan untuk ModelAdmin tertentu","anchor":"disabling-all-actions-for-a-particular-modeladmin","children":[]},{"title":"Tindakan mengadakan dan meniadakan bersyarat","anchor":"conditionally-enabling-or-disabling-actions","children":[]}]},{"title":"Pengaturan perizinan untuk tindakan","anchor":"setting-permissions-for-actions","children":[{"title":"Controlling where actions are available","anchor":"controlling-where-actions-are-available","children":[]}]}]},{"title":"The action decorator","anchor":"the-action-decorator","children":[]},{"title":"ActionLocation","anchor":"actionlocation","children":[]},{"title":"Action","anchor":"action","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"Acuan API","url":"/id/6.1/ref/"},{"docname":"ref/contrib/index","title":"Paket contrib","url":"/id/6.1/ref/contrib/"},{"docname":"ref/contrib/admin/index","title":"Situs admin Django","url":"/id/6.1/ref/contrib/admin/"}],"prev":{"docname":"ref/contrib/admin/index","title":"Situs admin Django","url":"/id/6.1/ref/contrib/admin/"},"next":{"docname":"ref/contrib/admin/filters","title":"ModelAdmin List Filters","url":"/id/6.1/ref/contrib/admin/filters/"},"formats":{"html":"/id/6.1/ref/contrib/admin/actions/","markdown":"/id/6.1/ref/contrib/admin/actions.md","json":"/id/6.1/ref/contrib/admin/actions.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/ref/contrib/admin/actions.txt","official":"https://docs.djangoproject.com/id/6.1/ref/contrib/admin/actions/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}