{"title":"管理アクション","version":"5.1","locale":"ja","docname":"ref/contrib/admin/actions","url":"/ja/5.1/ref/contrib/admin/actions/","canonical":"https://djangodocs.dev/ja/5.1/ref/contrib/admin/actions/","summary":"Djangoの管理者の基本的な仕事は、一言で言えば、「オブジェクトを選択し、それを変更する」ことに尽きます。これは大多数のユースケースに当てはまります。","html":"<h1>管理アクション<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>Djangoの管理者の基本的な仕事は、一言で言えば、「オブジェクトを選択し、それを変更する」ことに尽きます。これは大多数のユースケースに当てはまります。しかし、一度に多くのオブジェクトに同じ変更を適用する必要がある場合、この仕事は退屈です。</p>\n<p>このような場合、 Django の管理画面では、&quot;アクション&quot; を書いて登録できます。チェンジリストページで選択されたオブジェクトのリストで呼び出される関数です。</p>\n<p>Django には、すべてのモデルで利用可能な &quot;delete selected objects&quot; アクションが同梱されています。たとえば、これは Django 組み込みの <a class=\"reference internal\" href=\"/ja/5.1/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.auth</code></a> アプリの user モジュールです:</p>\n<img alt=\"/ja/5.1/_images/admin-actions.png\" src=\"/ja/5.1/_images/admin-actions.png\" />\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>&quot;選択したオブジェクトの削除&quot; アクションは効率の観点から <a class=\"reference internal\" href=\"/ja/5.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\">QuerySet.delete()</code></a> を使用します。使用したモデルの <code class=\"docutils literal notranslate\">delete()</code> メソッドが呼ばれないことは重要な注意点です。</p>\n<p>この動作をオーバーライドしたい場合は、 <a class=\"reference internal\" href=\"/ja/5.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\">ModelAdmin.delete_queryset()</code></a> をオーバーライドするか、選択された各アイテムに対して <code class=\"docutils literal notranslate\">Model.delete()</code> を呼び出すなど、お好みの方法で削除を行うカスタムアクションを書くことができます。</p>\n<p>一括削除に関するより詳しい背景については、 <a class=\"reference internal\" href=\"/ja/5.1/topics/db/queries/#topics-db-queries-delete\"><span class=\"std std-ref\">オブジェクトの削除</span></a> のドキュメントを参照してください。</p>\n</aside>\n<p>このリストに自分のアクションを追加する方法については、以下で説明しています。</p>\n<section id=\"writing-actions\">\n<h2>アクションを書く<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>アクションを説明する最も簡単な方法は例を挙げることです。早速詳しく見ていきましょう。</p>\n<p>管理アクションの一般的なユースケースはモデルの一括更新です。 <code class=\"docutils literal notranslate\">Article</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=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\nSTATUS_CHOICES <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=\"nc\">Article</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    title <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    body <span class=\"o\">=</span> models<span class=\"o\">.</span>TextField<span class=\"p\">()</span>\n    status <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> choices<span class=\"o\">=</span>STATUS_CHOICES<span class=\"p\">)</span>\n\n    <span class=\"k\">def</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>title\n</code></pre></div>\n<p>このようなモデルで行う一般的なタスクは記事のステータスを &quot;draft &quot;から &quot;published &quot;に更新することです。管理画面で一度に1つの記事を更新するのは簡単ですが、記事のグループを一括で公開するのは面倒です。そこで、記事のステータスを &quot;published &quot; に変更するアクションを書いてみましょう。</p>\n<section id=\"writing-action-functions\">\n<h3>アクション関数を書く<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>最初に、管理画面からアクションがトリガーされたときに呼び出される関数を書く必要があります。アクション関数は3つの引数を取る通常の関数です:</p>\n<ul class=\"simple\">\n<li><p>現在の <a class=\"reference internal\" href=\"/ja/5.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a></p></li>\n<li><p>現在のリクエストを表す <a class=\"reference internal\" href=\"/ja/5.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\">HttpRequest</code></a></p></li>\n<li><p>ユーザーが選択したオブジェクトのセットを含む <a class=\"reference internal\" href=\"/ja/5.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> 。</p></li>\n</ul>\n<p>publish-these-articles 関数は <a class=\"reference internal\" href=\"/ja/5.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</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=\"k\">def</span> <span class=\"nf\">make_published</span><span class=\"p\">(</span>modeladmin<span class=\"p\">,</span> request<span class=\"p\">,</span> queryset<span class=\"p\">):</span>\n    queryset<span class=\"o\">.</span>update<span class=\"p\">(</span>status<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\">注釈</p>\n<p>最高のパフォーマンスを得るために、クエリセットの <a class=\"reference internal\" href=\"/ja/5.1/topics/db/queries/#topics-db-queries-update\"><span class=\"std std-ref\">update メソッド</span></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=\"k\">for</span> obj <span class=\"ow\">in</span> queryset<span class=\"p\">:</span>\n    do_something_with<span class=\"p\">(</span>obj<span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n<p>アクションの書き方はこれだけです！しかし、もう1つオプションの、しかし便利なステップを踏んで、管理画面でアクションに &quot;素敵な &quot;タイトルをつけましょう。デフォルトでは、このアクションは &quot;Make published &quot;としてアクションリストに表示されます。しかし、 <code class=\"docutils literal notranslate\">make_published</code> 関数に <a class=\"reference internal\" href=\"#django.contrib.admin.action\" title=\"django.contrib.admin.action\"><code class=\"xref py py-func docutils literal notranslate\">action()</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=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n<span class=\"o\">...</span>\n\n\n<span class=\"nd\">@admin</span><span class=\"o\">.</span>action<span class=\"p\">(</span>description<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=\"nf\">make_published</span><span class=\"p\">(</span>modeladmin<span class=\"p\">,</span> request<span class=\"p\">,</span> queryset<span class=\"p\">):</span>\n    queryset<span class=\"o\">.</span>update<span class=\"p\">(</span>status<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\">注釈</p>\n<p>これには見覚えがあるかもしれません。admin の <a class=\"reference internal\" href=\"/ja/5.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\">list_display</code></a> オプションも、登録されたコールバック関数に対して人間が読みやすい説明を提供するために、 <a class=\"reference internal\" href=\"/ja/5.1/ref/contrib/admin/#django.contrib.admin.display\" title=\"django.contrib.admin.display\"><code class=\"xref py py-func docutils literal notranslate\">display()</code></a> デコレータを使用して同じテクニックを使っています。</p>\n</aside>\n</section>\n<section id=\"adding-actions-to-the-modeladmin\">\n<h3><a class=\"reference internal\" href=\"/ja/5.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</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>次に <a class=\"reference internal\" href=\"/ja/5.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> にアクションを通知する必要があります。これは他の設定オプションと同じように動作します。アクションとその登録を含む <code class=\"docutils literal notranslate\">admin.py</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=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Article\n\n\n<span class=\"nd\">@admin</span><span class=\"o\">.</span>action<span class=\"p\">(</span>description<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=\"nf\">make_published</span><span class=\"p\">(</span>modeladmin<span class=\"p\">,</span> request<span class=\"p\">,</span> queryset<span class=\"p\">):</span>\n    queryset<span class=\"o\">.</span>update<span class=\"p\">(</span>status<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=\"nc\">ArticleAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    list_display <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    ordering <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">]</span>\n    actions <span class=\"o\">=</span> <span class=\"p\">[</span>make_published<span class=\"p\">]</span>\n\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Article<span class=\"p\">,</span> ArticleAdmin<span class=\"p\">)</span>\n</code></pre></div>\n<p>このコードによって、次のような admin チェンジリストができます:</p>\n<img alt=\"/ja/5.1/_images/adding-actions-to-the-modeladmin.png\" src=\"/ja/5.1/_images/adding-actions-to-the-modeladmin.png\" />\n<p>本当にそれだけです！もしあなたが自分のアクションを書きたくてうずうずしているのであれば、これで始めるのに十分な知識が得られました。このドキュメントの残りの部分では、より高度なテクニックを扱います。</p>\n</section>\n<section id=\"handling-errors-in-actions\">\n<h3>アクション内でエラーをハンドリングする<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>アクションの実行中に予見可能なエラー状態が発生した場合、ユーザに問題を潔く知らせるべきです。これは、例外のハンドリングと、 <a class=\"reference internal\" href=\"/ja/5.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\">django.contrib.admin.ModelAdmin.message_user()</code></a> を使用して、レスポンスに問題のユーザーフレンドリーな説明を表示することを意味します。</p>\n</section>\n</section>\n<section id=\"advanced-action-techniques\">\n<h2>高度なアクションのテクニック<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>より高度なオプションのために、いくつかの追加の選択肢や出来ることがあります。</p>\n<section id=\"actions-as-modeladmin-methods\">\n<h3><a class=\"reference internal\" href=\"/ja/5.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</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>上記の例は、関数として定義された <code class=\"docutils literal notranslate\">make_published</code> アクションを示しています。これは全く問題ありませんが、コード設計の観点からは完璧とは言えません。アクションが <code class=\"docutils literal notranslate\">Article</code> オブジェクトに密接に結びついているため、アクションを <code class=\"docutils literal notranslate\">ArticleAdmin</code> オブジェクト自体にフックするほうが理にかなっています。</p>\n<p>次のようにします:</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=\"nc\">ArticleAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    actions <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>action<span class=\"p\">(</span>description<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=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> queryset<span class=\"p\">):</span>\n        queryset<span class=\"o\">.</span>update<span class=\"p\">(</span>status<span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>まず <code class=\"docutils literal notranslate\">make_published</code> をメソッドに移動し、 <code class=\"docutils literal notranslate\">modeladmin</code> パラメータの名前を <code class=\"docutils literal notranslate\">self</code> に変更していることに注意してください。次に、関数を直接参照する代わりに <code class=\"docutils literal notranslate\">actions</code> に <code class=\"docutils literal notranslate\">'make_published'</code> という文字列を指定していることに注意してください。これは <a class=\"reference internal\" href=\"/ja/5.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> にアクションをメソッドとして検索するように指示します。</p>\n<p>アクションをメソッドとして定義することで、アクションはより自然な形で <a class=\"reference internal\" href=\"/ja/5.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> 自体にアクセスすることができるようになり、admin が提供する任意のメソッドをアクションが呼び出せるようになります。</p>\n<p id=\"custom-admin-action\">例えば、<code class=\"docutils literal notranslate\">self</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=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> messages\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> ngettext\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ArticleAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> queryset<span class=\"p\">):</span>\n        updated <span class=\"o\">=</span> queryset<span class=\"o\">.</span>update<span class=\"p\">(</span>status<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>message_user<span class=\"p\">(</span>\n            request<span class=\"p\">,</span>\n            ngettext<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                updated<span class=\"p\">,</span>\n            <span class=\"p\">)</span>\n            <span class=\"o\">%</span> updated<span class=\"p\">,</span>\n            messages<span class=\"o\">.</span>SUCCESS<span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n</code></pre></div>\n<p>これにより、アクションの実行に成功した後の表示が admin 自身による表示とマッチするようになります:</p>\n<img alt=\"/ja/5.1/_images/actions-as-modeladmin-methods.png\" src=\"/ja/5.1/_images/actions-as-modeladmin-methods.png\" />\n</section>\n<section id=\"actions-that-provide-intermediate-pages\">\n<h3>中間ページを提供するアクション<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>デフォルトでは、アクションが実行された後、ユーザーは元のチェンジリストページにリダイレクトされます。しかし、いくつかのアクション、特により複雑なアクションは中間ページを返す必要があります。例えば、組み込みの削除アクションは、選択したオブジェクトを削除する前に確認を求めます。</p>\n<p>中間ページを提供するには、アクションから <a class=\"reference internal\" href=\"/ja/5.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\">HttpResponse</code></a> (またはそのサブクラス) を返します。たとえば、選択したオブジェクトを JSON としてダンプするエクスポート関数を書くには、Django の <a class=\"reference internal\" href=\"/ja/5.1/topics/serialization/\"><span class=\"doc\">シリアライズ関数</span></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=\"nn\">django.core</span> <span class=\"kn\">import</span> serializers\n<span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n\n\n<span class=\"k\">def</span> <span class=\"nf\">export_as_json</span><span class=\"p\">(</span>modeladmin<span class=\"p\">,</span> request<span class=\"p\">,</span> queryset<span class=\"p\">):</span>\n    response <span class=\"o\">=</span> HttpResponse<span class=\"p\">(</span>content_type<span class=\"o\">=</span><span class=\"s2\">&quot;application/json&quot;</span><span class=\"p\">)</span>\n    serializers<span class=\"o\">.</span>serialize<span class=\"p\">(</span><span class=\"s2\">&quot;json&quot;</span><span class=\"p\">,</span> queryset<span class=\"p\">,</span> stream<span class=\"o\">=</span>response<span class=\"p\">)</span>\n    <span class=\"k\">return</span> response\n</code></pre></div>\n<p>通常、上記のようなことはあまり良いアイデアとはみなされません。たいていの場合、 <a class=\"reference internal\" href=\"/ja/5.1/ref/request-response/#django.http.HttpResponseRedirect\" title=\"django.http.HttpResponseRedirect\"><code class=\"xref py py-class docutils literal notranslate\">HttpResponseRedirect</code></a> を返し、選択したオブジェクトのリストを GET クエリ文字列で渡して、あなたが書いたビューにユーザをリダイレクトするのがベストプラクティスでしょう。これにより、中間ページで複雑なインタラクションロジックを提供できます。たとえば、より完全なエクスポート機能を提供したい場合、ユーザーにフォーマットや、場合によってはエクスポートに含めるフィールドのリストを選択させたいでしょう。最良の方法は、カスタムエクスポートビューにリダイレクトする小さなアクションを書くことです:</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=\"nn\">django.contrib.contenttypes.models</span> <span class=\"kn\">import</span> ContentType\n<span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponseRedirect\n\n\n<span class=\"k\">def</span> <span class=\"nf\">export_selected_objects</span><span class=\"p\">(</span>modeladmin<span class=\"p\">,</span> request<span class=\"p\">,</span> queryset<span class=\"p\">):</span>\n    selected <span class=\"o\">=</span> queryset<span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">,</span> flat<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    ct <span class=\"o\">=</span> ContentType<span class=\"o\">.</span>objects<span class=\"o\">.</span>get_for_model<span class=\"p\">(</span>queryset<span class=\"o\">.</span>model<span class=\"p\">)</span>\n    <span class=\"k\">return</span> HttpResponseRedirect<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            ct<span class=\"o\">.</span>pk<span class=\"p\">,</span>\n            <span class=\"s2\">&quot;,&quot;</span><span class=\"o\">.</span>join<span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span>pk<span class=\"p\">)</span> <span class=\"k\">for</span> pk <span class=\"ow\">in</span> selected<span class=\"p\">),</span>\n        <span class=\"p\">)</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p>見ての通り、アクションはとても短いです。複雑なロジックはすべてエクスポートビューにあります。これは任意のタイプのオブジェクトを扱う必要があるため、<code class=\"docutils literal notranslate\">ContentType</code> に関する処理が必要になります。</p>\n<p>このビューの作成は、読者にとっての演習課題として残されています。</p>\n</section>\n<section id=\"making-actions-available-site-wide\">\n<span id=\"adminsite-actions\"></span><h3>アクションをサイト全体で利用可能にする<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\">AdminSite.</span><span class=\"sig-name descname\">add_action</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">action</em>, <em class=\"sig-param\">name<span class=\"o\">=</span><span class=\"default_value\">None</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>アクションによっては、管理サイトの <em>すべての</em> オブジェクトで利用できるようにするのが最適なものもあります。上記で定義したエクスポートアクションはその良い候補でしょう。アクションをグローバルに利用可能にするには <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\">AdminSite.add_action()</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=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>add_action<span class=\"p\">(</span>export_selected_objects<span class=\"p\">)</span>\n</code></pre></div>\n<p>これにより、<code class=\"docutils literal notranslate\">export_selected_objects</code> アクションは &quot;export_selected_objects&quot; という名前のアクションとしてグローバルに利用可能になります。後でプログラム的に <a class=\"reference internal\" href=\"#disabling-admin-actions\"><span class=\"std std-ref\">アクションを削除する</span></a> 場合に備えてアクションに明示的に名前を付けたい場合は、 <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\">AdminSite.add_action()</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>admin<span class=\"o\">.</span>site<span class=\"o\">.</span>add_action<span class=\"p\">(</span>export_selected_objects<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>アクションを無効にする<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>特定のオブジェクトに対して、 <a class=\"reference internal\" href=\"#adminsite-actions\"><span class=\"std std-ref\">サイト全体に登録された</span></a> 特定のアクションを無効にしたいことがあるでしょう。アクションを無効にする方法はいくつかあります:</p>\n<section id=\"disabling-a-site-wide-action\">\n<h4>サイト全体のアクションを無効にする<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\">AdminSite.</span><span class=\"sig-name descname\">disable_action</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">name</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><a class=\"reference internal\" href=\"#adminsite-actions\"><span class=\"std std-ref\">サイト全体のアクション</span></a> を無効にするには、 <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\">AdminSite.disable_action()</code></a> を呼び出します。</p>\n<p>例えば、このメソッドを使って、組み込みの &quot;delete selected objects&quot; アクションを削除できます:</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>admin<span class=\"o\">.</span>site<span class=\"o\">.</span>disable_action<span class=\"p\">(</span><span class=\"s2\">&quot;delete_selected&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>上記の操作を行うと、そのアクションはサイト全体で無効になります。</p>\n<p>しかし、ある特定のモデルに対してグローバルに無効化されたアクションを再度有効にする必要がある場合は、<code class=\"docutils literal notranslate\">ModelAdmin.actions</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=\"c1\"># Globally disable delete selected</span>\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>disable_action<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=\"nc\">SomeModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    actions <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=\"nc\">AnotherModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    actions <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>特定の <a class=\"reference internal\" href=\"/ja/5.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> ですべてのアクションを無効にする<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>指定した <a class=\"reference internal\" href=\"/ja/5.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> で <em>すべての</em> 一括アクションを無効にするには、 <a class=\"reference internal\" href=\"/ja/5.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.actions\" title=\"django.contrib.admin.ModelAdmin.actions\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.actions</code></a> を <code class=\"docutils literal notranslate\">None</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=\"nc\">MyModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    actions <span class=\"o\">=</span> <span class=\"kc\">None</span>\n</code></pre></div>\n<p>これは <a class=\"reference internal\" href=\"/ja/5.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> に対して、 <a class=\"reference internal\" href=\"#adminsite-actions\"><span class=\"std std-ref\">サイト全体のアクション</span></a> を含む全てのアクションを表示しない、または許可しないようにします。</p>\n</section>\n<section id=\"conditionally-enabling-or-disabling-actions\">\n<h4>条件付きでアクションを有効/無効にする<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\">ModelAdmin.</span><span class=\"sig-name descname\">get_actions</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</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>最後に、 <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\">ModelAdmin.get_actions()</code></a> をオーバーライドすることで、リクエスト単位で (つまりユーザ単位で) 条件付きでアクションを有効/無効にすることができます。</p>\n<p>これは許可されているアクションの辞書を返します。キーはアクション名で、値は <code class=\"docutils literal notranslate\">(function, name, short_description)</code> タプルです。</p>\n<p>たとえば、名前が <code class=\"docutils literal notranslate\">J</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=\"nc\">MyModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_actions</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">):</span>\n        actions <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>get_actions<span class=\"p\">(</span>request<span class=\"p\">)</span>\n        <span class=\"k\">if</span> request<span class=\"o\">.</span>user<span class=\"o\">.</span>username<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span>upper<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> actions<span class=\"p\">:</span>\n                <span class=\"k\">del</span> actions<span class=\"p\">[</span><span class=\"s2\">&quot;delete_selected&quot;</span><span class=\"p\">]</span>\n        <span class=\"k\">return</span> actions\n</code></pre></div>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"setting-permissions-for-actions\">\n<span id=\"admin-action-permissions\"></span><h3>アクションに権限を設定する<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>特定の権限を持つユーザーに利用を制限するには、アクション関数を <a class=\"reference internal\" href=\"#django.contrib.admin.action\" title=\"django.contrib.admin.action\"><code class=\"xref py py-func docutils literal notranslate\">action()</code></a> デコレータでラップし、次のように <code class=\"docutils literal notranslate\">permissions</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=\"nd\">@admin</span><span class=\"o\">.</span>action<span class=\"p\">(</span>permissions<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=\"nf\">make_published</span><span class=\"p\">(</span>modeladmin<span class=\"p\">,</span> request<span class=\"p\">,</span> queryset<span class=\"p\">):</span>\n    queryset<span class=\"o\">.</span>update<span class=\"p\">(</span>status<span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">make_published()</code> アクションは <a class=\"reference internal\" href=\"/ja/5.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\">ModelAdmin.has_change_permission()</code></a> チェックに合格したユーザのみが利用できます。</p>\n<p>もし <code class=\"docutils literal notranslate\">permissions</code> が複数のパーミッションを持っている場合、ユーザが少なくとも1つのチェックに合格していれば、そのアクションを利用できます。</p>\n<p><code class=\"docutils literal notranslate\">permissions</code> で使用可能な値と対応するメソッドチェックは以下の通りです。</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">'add'</code>: <a class=\"reference internal\" href=\"/ja/5.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\">ModelAdmin.has_add_permission()</code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\">'change'</code>: <a class=\"reference internal\" href=\"/ja/5.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\">ModelAdmin.has_change_permission()</code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\">'delete'</code>: <a class=\"reference internal\" href=\"/ja/5.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\">ModelAdmin.has_delete_permission()</code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\">'view'</code>: <a class=\"reference internal\" href=\"/ja/5.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\">ModelAdmin.has_view_permission()</code></a></p></li>\n</ul>\n<p>対応する <code class=\"docutils literal notranslate\">has_&lt;value&gt;_permission(self, request)</code> メソッドを <code class=\"docutils literal notranslate\">ModelAdmin</code> に実装すれば、他の値も指定できます。</p>\n<p>例:</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=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth</span> <span class=\"kn\">import</span> get_permission_codename\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ArticleAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    actions <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>action<span class=\"p\">(</span>permissions<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=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> queryset<span class=\"p\">):</span>\n        queryset<span class=\"o\">.</span>update<span class=\"p\">(</span>status<span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">has_publish_permission</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;Does the user have the publish permission?&quot;&quot;&quot;</span>\n        opts <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>opts\n        codename <span class=\"o\">=</span> get_permission_codename<span class=\"p\">(</span><span class=\"s2\">&quot;publish&quot;</span><span class=\"p\">,</span> opts<span class=\"p\">)</span>\n        <span class=\"k\">return</span> request<span class=\"o\">.</span>user<span class=\"o\">.</span>has_perm<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>opts<span class=\"o\">.</span>app_label<span class=\"p\">,</span> codename<span class=\"p\">))</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"the-action-decorator\">\n<h2><code class=\"docutils literal notranslate\">action</code> デコレータ<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\">action</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\">*</abbr></span></em>, <em class=\"sig-param\">permissions<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">description<span class=\"o\">=</span><span class=\"default_value\">None</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>このデコレータは、<a class=\"reference internal\" href=\"/ja/5.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.actions\" title=\"django.contrib.admin.ModelAdmin.actions\"><code class=\"xref py py-attr docutils literal notranslate\">actions</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>action<span class=\"p\">(</span>\n    permissions<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;publish&quot;</span><span class=\"p\">],</span>\n    description<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=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> queryset<span class=\"p\">):</span>\n    queryset<span class=\"o\">.</span>update<span class=\"p\">(</span>status<span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>これは、いくつかの属性を（元の長い名前で）関数に直接設定することと等価です。</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=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> queryset<span class=\"p\">):</span>\n    queryset<span class=\"o\">.</span>update<span class=\"p\">(</span>status<span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n\n\nmake_published<span class=\"o\">.</span>allowed_permissions <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;publish&quot;</span><span class=\"p\">]</span>\nmake_published<span class=\"o\">.</span>short_description <span class=\"o\">=</span> <span class=\"s2\">&quot;Mark selected stories as published&quot;</span>\n</code></pre></div>\n<p>このデコレータの使用は、アクション関数を作成する上で必須ではありませんが、 関数の目的を特定するための目印として、引数なしで使用すると便利です。</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>action\n<span class=\"k\">def</span> <span class=\"nf\">make_inactive</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> queryset<span class=\"p\">):</span>\n    queryset<span class=\"o\">.</span>update<span class=\"p\">(</span>is_active<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>この場合、関数に属性は追加されません。</p>\n<p>アクションの説明は %-フォーマットで、 <code class=\"docutils literal notranslate\">'%(verbose_name)s'</code> と <code class=\"docutils literal notranslate\">'%(verbose_name_plural)s'</code> のプレースホルダを含むことができ、それぞれモデルの <a class=\"reference internal\" href=\"/ja/5.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\">verbose_name</code></a> と <a class=\"reference internal\" href=\"/ja/5.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\">verbose_name_plural</code></a> に置き換えられます。</p>\n</dd></dl>\n\n</section>","rootId":"admin-actions","toc":[{"title":"アクションを書く","anchor":"writing-actions","children":[{"title":"アクション関数を書く","anchor":"writing-action-functions","children":[]},{"title":"ModelAdmin にアクションを追加する","anchor":"adding-actions-to-the-modeladmin","children":[]},{"title":"アクション内でエラーをハンドリングする","anchor":"handling-errors-in-actions","children":[]}]},{"title":"高度なアクションのテクニック","anchor":"advanced-action-techniques","children":[{"title":"ModelAdmin メソッドとしてのアクション","anchor":"actions-as-modeladmin-methods","children":[]},{"title":"中間ページを提供するアクション","anchor":"actions-that-provide-intermediate-pages","children":[]},{"title":"アクションをサイト全体で利用可能にする","anchor":"making-actions-available-site-wide","children":[]},{"title":"アクションを無効にする","anchor":"disabling-actions","children":[{"title":"サイト全体のアクションを無効にする","anchor":"disabling-a-site-wide-action","children":[]},{"title":"特定の ModelAdmin ですべてのアクションを無効にする","anchor":"disabling-all-actions-for-a-particular-modeladmin","children":[]},{"title":"条件付きでアクションを有効/無効にする","anchor":"conditionally-enabling-or-disabling-actions","children":[]}]},{"title":"アクションに権限を設定する","anchor":"setting-permissions-for-actions","children":[]}]},{"title":"action デコレータ","anchor":"the-action-decorator","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"API リファレンス","url":"/ja/5.1/ref/"},{"docname":"ref/contrib/index","title":"contrib パッケージ","url":"/ja/5.1/ref/contrib/"},{"docname":"ref/contrib/admin/index","title":"Django の admin サイト","url":"/ja/5.1/ref/contrib/admin/"}],"prev":{"docname":"ref/contrib/admin/index","title":"Django の admin サイト","url":"/ja/5.1/ref/contrib/admin/"},"next":{"docname":"ref/contrib/admin/filters","title":"ModelAdmin リストフィルタ","url":"/ja/5.1/ref/contrib/admin/filters/"},"formats":{"html":"/ja/5.1/ref/contrib/admin/actions/","markdown":"/ja/5.1/ref/contrib/admin/actions.md","json":"/ja/5.1/ref/contrib/admin/actions.json"},"source":"https://github.com/django/django/blob/stable/5.1.x/docs/ref/contrib/admin/actions.txt","official":"https://docs.djangoproject.com/ja/5.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","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}