{"title":"Actions d’administration","version":"2.2","locale":"fr","docname":"ref/contrib/admin/actions","url":"/fr/2.2/ref/contrib/admin/actions/","canonical":"https://djangodocs.dev/fr/2.2/ref/contrib/admin/actions/","summary":"Le mode de travail de base de l’administration de Django est en résumé : « sélectionner un objet, puis le changer ». Cela fonctionne bien pour la majorité des cas…","html":"<h1>Actions d’administration<a class=\"heading-anchor\" href=\"#admin-actions\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Le mode de travail de base de l’administration de Django est en résumé : « sélectionner un objet, puis le changer ». Cela fonctionne bien pour la majorité des cas d’utilisation. Toutefois, si vous devez effectuer la même modification à plusieurs objets à la fois, ce mode de travail peut être assez fastidieux.</p>\n<p>Dans ces cas, l’administration de Django vous permet d’écrire et d’inscrire des « actions » – de simples fonctions appelées avec une liste d’objets sélectionnés depuis la page de liste pour modification.</p>\n<p>Si vous examinez n’importe quelle liste d’objets à modifier dans l’administration, vous verrez cette fonctionnalité en action ; Django est livré avec une action « supprimer les objets sélectionnés » disponible pour tous les modèles. Par exemple, voici le module utilisateur de l’application <a class=\"reference internal\" href=\"/fr/2.2/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> intégrée dans Django :</p>\n<img alt=\"/fr/2.2/_images/admin-actions.png\" src=\"/fr/2.2/_images/admin-actions.png\" />\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>L’action « supprimer les objets sélectionnés » utilise <a class=\"reference internal\" href=\"/fr/2.2/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> pour des raisons d’efficacité, entraînant une importante mise en garde : la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> de vos modèles ne sera pas appelée.</p>\n<p>Si vous souhaitez modifier ce comportement, vous pouvez surcharger <a class=\"reference internal\" href=\"/fr/2.2/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> ou écrire une action personnalisée qui s’occupe de la suppression à votre manière – par exemple, en appelant <code class=\"docutils literal notranslate\"><span class=\"pre\">Model.delete()</span></code> pour chacun des éléments sélectionnés.</p>\n<p>Pour plus d’informations sur la suppression en vrac, voir la documentation sur la <a class=\"reference internal\" href=\"/fr/2.2/topics/db/queries/#topics-db-queries-delete\"><span class=\"std std-ref\">suppression d’objets</span></a>.</p>\n</aside>\n<p>Lisez la suite pour savoir comment ajouter vos propres actions à cette liste.</p>\n<section id=\"writing-actions\">\n<h2>Écriture d’actions<a class=\"heading-anchor\" href=\"#writing-actions\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>La meilleure façon d’expliquer les actions est de montrer un exemple. Allons-y !</p>\n<p>Un cas d’utilisation courant pour les actions d’administration est la mise à jour en vrac d’un modèle. Imaginez une application simple de nouvelles avec un modèle <code class=\"docutils literal notranslate\"><span class=\"pre\">Article</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=\"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=\"p\">(</span><span class=\"s1\">&#39;d&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Draft&#39;</span><span class=\"p\">),</span>\n    <span class=\"p\">(</span><span class=\"s1\">&#39;p&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Published&#39;</span><span class=\"p\">),</span>\n    <span class=\"p\">(</span><span class=\"s1\">&#39;w&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Withdrawn&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\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>Une tâche courante que nous pourrions réaliser avec un tel modèle est de mettre à jour l’état d’un article de « brouillon » à « publié ». Nous pourrions facilement le faire dans l’administration un article à la fois, mais si nous voulions publier en vrac une série d’articles, ce serait fastidieux. Écrivons donc une action qui nous permet de modifier l’état d’un article à « publié ».</p>\n<section id=\"writing-action-functions\">\n<h3>Écriture des fonctions d’action<a class=\"heading-anchor\" href=\"#writing-action-functions\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Tout d’abord, nous devons écrire une fonction qui est appelée quand l’action est déclenchée depuis l’administration. Les fonctions d’action sont de simples fonctions ordinaires qui acceptent trois paramètres :</p>\n<ul class=\"simple\">\n<li><p>La classe <a class=\"reference internal\" href=\"/fr/2.2/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> concernée</p></li>\n<li><p>Un objet <a class=\"reference internal\" href=\"/fr/2.2/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> représentant la requête actuelle</p></li>\n<li><p>Un jeu de requête <a class=\"reference internal\" href=\"/fr/2.2/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> contenant l’ensemble des objets sélectionnés par l’utilisateur.</p></li>\n</ul>\n<p>Notre fonction de publication d’articles n’aura pas besoin de la classe <a class=\"reference internal\" href=\"/fr/2.2/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> ni de l’objet requête, mais nous allons utiliser le jeu de requête :</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=\"s1\">&#39;p&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Pour de meilleures performances, nous utiliserons la <a class=\"reference internal\" href=\"/fr/2.2/topics/db/queries/#topics-db-queries-update\"><span class=\"std std-ref\">méthode update</span></a> (mise à jour) du jeu de requête. D’autres types d’actions pourraient avoir besoin de manipuler chaque objet individuellement ; dans ce cas, nous itérerions simplement sur le jeu de requête :</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>C’est en fait tout ce qu’il y a besoin d’écrire pour une action ! Toutefois, nous allons effectuer une étape supplémentaire facultative mais utile et donner un « joli » titre à l’action dans l’interface d’administration. Par défaut, cette action apparaît dans la liste d’actions comme « Make published » – le nom de la fonction avec les soulignements remplacés par des espaces. C’est bien, mais nous pouvons fournir un nom meilleur et plus convivial en donnant à la fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">make_published</span></code> un attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">short_description</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\">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=\"s1\">&#39;p&#39;</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<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Cela peut sembler familier ; l’option d’administration <code class=\"docutils literal notranslate\"><span class=\"pre\">list_display</span></code> utilise aussi la même technique pour fournir des descriptions lisibles pour les fonctions de rappel qui y sont inscrites.</p>\n</aside>\n</section>\n<section id=\"adding-actions-to-the-modeladmin\">\n<h3>Ajout d’actions à la classe <a class=\"reference internal\" href=\"/fr/2.2/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\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ensuite, il faudra informer la <a class=\"reference internal\" href=\"/fr/2.2/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> de l’action. Cela fonctionne comme n’importe quelle autre option de configuration. Ainsi, le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.py</span></code> complet avec l’action et son inscription ressemblerait à :</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<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=\"s1\">&#39;p&#39;</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\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=\"s1\">&#39;title&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;status&#39;</span><span class=\"p\">]</span>\n    <span class=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;title&#39;</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<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>Avec ce code, la liste d’objets à modifier dans l’interface d’administration ressemble à ceci :</p>\n<img alt=\"/fr/2.2/_images/adding-actions-to-the-modeladmin.png\" src=\"/fr/2.2/_images/adding-actions-to-the-modeladmin.png\" />\n<p>C’est vraiment tout ce qu’il y a à faire ! Si vous brûlez d’écrire vos propres actions, vous en savez maintenant assez pour débuter. Le reste de ce document ne couvre que des techniques plus avancées.</p>\n</section>\n<section id=\"handling-errors-in-actions\">\n<h3>Gestion des erreurs dans les actions<a class=\"heading-anchor\" href=\"#handling-errors-in-actions\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>S’il y a des conditions d’erreur prévisibles qui peuvent survenir lors de l’exécution de votre action, vous devriez faire amende honorable en informant l’utilisateur du problème. Cela signifie gérer les exceptions et utiliser <a class=\"reference internal\" href=\"/fr/2.2/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> pour afficher une description conviviale du problème dans la réponse.</p>\n</section>\n</section>\n<section id=\"advanced-action-techniques\">\n<h2>Techniques d’action avancées<a class=\"heading-anchor\" href=\"#advanced-action-techniques\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Il y a quelques options et possibilités supplémentaires que vous pouvez exploiter pour des options plus avancées.</p>\n<section id=\"actions-as-modeladmin-methods\">\n<h3>Actions en tant que méthodes de <a class=\"reference internal\" href=\"/fr/2.2/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\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>L’exemple ci-dessus montre l’action <code class=\"docutils literal notranslate\"><span class=\"pre\">make_published</span></code> définie comme une fonction simple. C’est tout à fait correct, mais ce n’est pas parfait d’un point de vue conception de code : comme l’action est étroitement couplée à l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Article</span></code>, il paraît logique de fusionner l’action dans l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleAdmin</span></code> même.</p>\n<p>C’est assez facile à réaliser :</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=\"s1\">&#39;make_published&#39;</span><span class=\"p\">]</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\">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=\"s1\">&#39;p&#39;</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>Remarquez d’abord que nous avons transformé <code class=\"docutils literal notranslate\"><span class=\"pre\">make_published</span></code> en une méthode et renommé le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">modeladmin</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">self</span></code>, puis que nous avons placé la chaîne <code class=\"docutils literal notranslate\"><span class=\"pre\">make_published</span></code> dans <code class=\"docutils literal notranslate\"><span class=\"pre\">actions</span></code> à la place d’une référence de fonction directe. Cela indique à <a class=\"reference internal\" href=\"/fr/2.2/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> de rechercher l’action en tant que méthode.</p>\n<p>Définir les actions en tant que méthodes donne à l’action un accès plus direct et idiomatique à la classe <a class=\"reference internal\" href=\"/fr/2.2/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> elle-même, permettant à l’action d’appeler l’une des méthodes définies par l’application d’administration.</p>\n<p id=\"custom-admin-action\">Par exemple, nous pouvons utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">self</span></code> pour afficher un message à l’utilisateur l’informant que l’action a réussi :</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=\"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\">rows_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=\"s1\">&#39;p&#39;</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">rows_updated</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n            <span class=\"n\">message_bit</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;1 story was&quot;</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"n\">message_bit</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\"> stories were&quot;</span> <span class=\"o\">%</span> <span class=\"n\">rows_updated</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">message_user</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\"> successfully marked as published.&quot;</span> <span class=\"o\">%</span> <span class=\"n\">message_bit</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Cela fait ressembler l’action à ce que l’administration elle-même réalise après avoir réussi à effectuer une action :</p>\n<img alt=\"/fr/2.2/_images/actions-as-modeladmin-methods.png\" src=\"/fr/2.2/_images/actions-as-modeladmin-methods.png\" />\n</section>\n<section id=\"actions-that-provide-intermediate-pages\">\n<h3>Actions qui fournissent des pages intermédiaires<a class=\"heading-anchor\" href=\"#actions-that-provide-intermediate-pages\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Par défaut, après qu’une action a été effectuée, l’utilisateur est simplement redirigé vers la page d’origine de la liste d’édition. Cependant, certaines actions, en particulier les plus complexes, pourraient devoir renvoyer à des pages intermédiaires. Par exemple, l’action de suppression intégrée demande confirmation avant de supprimer les objets sélectionnés.</p>\n<p>Pour fournir une page intermédiaire, il suffit de renvoyer une réponse <a class=\"reference internal\" href=\"/fr/2.2/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> (ou une sous-classe) depuis votre action. Par exemple, vous pourriez écrire une fonction d’exportation simple qui utilise les <a class=\"reference internal\" href=\"/fr/2.2/topics/serialization/\"><span class=\"doc\">fonctions de sérialisation</span></a> de Django pour exporter certains objets sélectionnés en 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<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>En général, l’exemple ci-dessus n’est pas considéré comme une bonne idée. La plupart du temps, la pratique conseillée est de renvoyer une réponse <a class=\"reference internal\" href=\"/fr/2.2/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> et de rediriger l’utilisateur vers une vue que vous avez écrite, en passant la liste des objets sélectionnés dans la chaîne de requête GET. Cela vous permet de fournir une logique d’interaction complexe sur les pages intermédiaires. Par exemple, si vous vouliez fournir une fonction d’exportation plus complète, vous voudriez que l’utilisateur puisse choisir un format et peut-être une liste de champs à inclure dans l’exportation. La meilleure chose à faire serait d’écrire une petite action qui redirige tout simplement vers la vue d’exportation personnalisée :</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<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=\"s1\">&#39;pk&#39;</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><span class=\"s1\">&#39;/export/?ct=</span><span class=\"si\">%s</span><span class=\"s1\">&amp;ids=</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span> <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=\"s1\">&#39;,&#39;</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</code></pre></div>\n<p>Comme vous pouvez le voir, l’action est la partie la plus simple ; toute la logique complexe est déléguée à la vue d’exportation. Celle-ci doit se charger de traiter des objets de tout type, d’où la présence du modèle <code class=\"docutils literal notranslate\"><span class=\"pre\">ContentType</span></code>.</p>\n<p>La rédaction de cette vue est laissée en exercice au lecteur.</p>\n</section>\n<section id=\"making-actions-available-site-wide\">\n<span id=\"adminsite-actions\"></span><h3>Actions disponibles pour l’ensemble d’un site<a class=\"heading-anchor\" href=\"#making-actions-available-site-wide\"><span class=\"visually-hidden\">Lien vers cette rubrique</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\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Certaines actions sont plus efficaces lorsqu’elles sont mises à la disposition de <em>tous</em> les objets dans le site d’administration – l’action d’exportation définie ci-dessus serait un bon candidat. Vous pouvez rendre une action globalement disponible en utilisant <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>. Par exemple :</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>Cela rend l’action <code class=\"docutils literal notranslate\"><span class=\"pre\">export_selected_objects</span></code> globalement disponible en tant qu’action nommée « export_selected_objects ». Vous pouvez explicitement donner un nom à l’action – utile si vous souhaitez plus tard programmatiquement <a class=\"reference internal\" href=\"#disabling-admin-actions\"><span class=\"std std-ref\">supprimer l’action</span></a> – en passant un second argument à <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=\"s1\">&#39;export_selected&#39;</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>Désactivation des actions<a class=\"heading-anchor\" href=\"#disabling-actions\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Parfois, vous devez désactiver certaines actions – en particulier celles <a class=\"reference internal\" href=\"#adminsite-actions\"><span class=\"std std-ref\">enregistrées globalement</span></a> – pour des objets particuliers. Il y a plusieurs façons dont vous pouvez désactiver les actions :</p>\n<section id=\"disabling-a-site-wide-action\">\n<h4>Désactivation d’une action à l’échelle du site<a class=\"heading-anchor\" href=\"#disabling-a-site-wide-action\"><span class=\"visually-hidden\">Lien vers cette rubrique</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\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Si vous avez besoin de désactiver une <a class=\"reference internal\" href=\"#adminsite-actions\"><span class=\"std std-ref\">action à l’échelle du site</span></a> vous pouvez appeler <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>Par exemple, vous pouvez utiliser cette méthode pour supprimer l’action intégrée « supprimer les objets sélectionnés » :</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=\"s1\">&#39;delete_selected&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Une fois que vous avez fait ce qui précède, cette action ne sera plus disponible à l’ensemble du site.</p>\n<p>Si toutefois vous avez besoin de réactiver une action globalement désactivée pour un modèle en particulier, il suffit de l’indiquer explicitement dans la liste <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelAdmin.actions</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=\"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=\"s1\">&#39;delete_selected&#39;</span><span class=\"p\">)</span>\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=\"s1\">&#39;some_other_action&#39;</span><span class=\"p\">]</span>\n    <span class=\"o\">...</span>\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=\"s1\">&#39;delete_selected&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;a_third_action&#39;</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>Désactivation de toutes les actions pour une classe <a class=\"reference internal\" href=\"/fr/2.2/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> particulière<a class=\"heading-anchor\" href=\"#disabling-all-actions-for-a-particular-modeladmin\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Si vous ne voulez <em>aucune</em> action en vrac disponible pour une classe <a class=\"reference internal\" href=\"/fr/2.2/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> donnée, il suffit de définir <a class=\"reference internal\" href=\"/fr/2.2/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> à <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>Cela indique à la classe <a class=\"reference internal\" href=\"/fr/2.2/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> de n’afficher ni d’autoriser aucune des actions, y compris les <a class=\"reference internal\" href=\"#adminsite-actions\"><span class=\"std std-ref\">actions globales au site</span></a>.</p>\n</section>\n<section id=\"conditionally-enabling-or-disabling-actions\">\n<h4>Activation ou désactivation conditionnelle des actions<a class=\"heading-anchor\" href=\"#conditionally-enabling-or-disabling-actions\"><span class=\"visually-hidden\">Lien vers cette rubrique</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><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_actions\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Enfin, vous pouvez activer ou désactiver conditionnellement les actions selon la requête (et donc par utilisateur) en redéfinissant <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>Cela renvoie un dictionnaire d’actions autorisées. Les clés sont des noms d’action, et les valeurs sont des tuples <code class=\"docutils literal notranslate\"><span class=\"pre\">(fonction,</span> <span class=\"pre\">nom,</span> <span class=\"pre\">description</span> <span class=\"pre\">courte)</span></code>.</p>\n<p>Par exemple, si vous souhaitez que seuls les utilisateurs dont le nom commence par « J » puissent supprimer des objets en masse</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>\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>\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=\"s1\">&#39;J&#39;</span><span class=\"p\">:</span>\n            <span class=\"k\">if</span> <span class=\"s1\">&#39;delete_selected&#39;</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=\"s1\">&#39;delete_selected&#39;</span><span class=\"p\">]</span>\n        <span class=\"k\">return</span> <span class=\"n\">actions</span>\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>Définition de permissions pour les actions<a class=\"heading-anchor\" href=\"#setting-permissions-for-actions\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"2.1\">\n<p class=\"version-note-title\">New in Django 2.1</p></aside>\n<p>Les actions peuvent limiter leur disponibilité aux utilisateurs ayant des permissions spécifiques en définissant l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">allowed_permissions</span></code> sur la fonction d’action</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=\"s1\">&#39;p&#39;</span><span class=\"p\">)</span>\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=\"s1\">&#39;change&#39;</span><span class=\"p\">,)</span>\n</code></pre></div>\n<p>L’action <code class=\"docutils literal notranslate\"><span class=\"pre\">make_published()</span></code> ne sera disponible que pour les utilisateurs qui passent le contrôle <a class=\"reference internal\" href=\"/fr/2.2/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>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">allowed_permissions</span></code> possède plus d’une permission, l’action sera disponible si l’utilisateur passe au moins l’un des contrôles.</p>\n<p>Les valeurs disponibles pour <code class=\"docutils literal notranslate\"><span class=\"pre\">allowed_permissions</span></code> et leur méthodes de contrôle correspondantes sont :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'add'</span></code> (ajout) : <a class=\"reference internal\" href=\"/fr/2.2/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> (modification) : <a class=\"reference internal\" href=\"/fr/2.2/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> (suppression) : <a class=\"reference internal\" href=\"/fr/2.2/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> (affichage) : <a class=\"reference internal\" href=\"/fr/2.2/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>Vous pouvez indiquer d’autres valeurs pour autant que vous implémentiez une méthode correspondante <code class=\"docutils literal notranslate\"><span class=\"pre\">has_&lt;valeur&gt;_permission(self,</span> <span class=\"pre\">request)</span></code> pour la classe <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code> concernée.</p>\n<p>Par exemple :</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<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=\"s1\">&#39;make_published&#39;</span><span class=\"p\">]</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\">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=\"s1\">&#39;p&#39;</span><span class=\"p\">)</span>\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=\"s1\">&#39;publish&#39;</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=\"s1\">&#39;publish&#39;</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=\"s1\">&#39;</span><span class=\"si\">%s</span><span class=\"s1\">.</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</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>\n</section>","rootId":"admin-actions","toc":[{"title":"Écriture d’actions","anchor":"writing-actions","children":[{"title":"Écriture des fonctions d’action","anchor":"writing-action-functions","children":[]},{"title":"Ajout d’actions à la classe ModelAdmin","anchor":"adding-actions-to-the-modeladmin","children":[]},{"title":"Gestion des erreurs dans les actions","anchor":"handling-errors-in-actions","children":[]}]},{"title":"Techniques d’action avancées","anchor":"advanced-action-techniques","children":[{"title":"Actions en tant que méthodes de ModelAdmin","anchor":"actions-as-modeladmin-methods","children":[]},{"title":"Actions qui fournissent des pages intermédiaires","anchor":"actions-that-provide-intermediate-pages","children":[]},{"title":"Actions disponibles pour l’ensemble d’un site","anchor":"making-actions-available-site-wide","children":[]},{"title":"Désactivation des actions","anchor":"disabling-actions","children":[{"title":"Désactivation d’une action à l’échelle du site","anchor":"disabling-a-site-wide-action","children":[]},{"title":"Désactivation de toutes les actions pour une classe ModelAdmin particulière","anchor":"disabling-all-actions-for-a-particular-modeladmin","children":[]},{"title":"Activation ou désactivation conditionnelle des actions","anchor":"conditionally-enabling-or-disabling-actions","children":[]}]},{"title":"Définition de permissions pour les actions","anchor":"setting-permissions-for-actions","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/2.2/ref/"},{"docname":"ref/contrib/index","title":"Paquets contrib","url":"/fr/2.2/ref/contrib/"},{"docname":"ref/contrib/admin/index","title":"Le site d’administration de Django","url":"/fr/2.2/ref/contrib/admin/"}],"prev":{"docname":"ref/contrib/admin/index","title":"Le site d’administration de Django","url":"/fr/2.2/ref/contrib/admin/"},"next":{"docname":"ref/contrib/admin/admindocs","title":"Le générateur de documentation de l’administration de Django","url":"/fr/2.2/ref/contrib/admin/admindocs/"},"formats":{"html":"/fr/2.2/ref/contrib/admin/actions/","markdown":"/fr/2.2/ref/contrib/admin/actions.md","json":"/fr/2.2/ref/contrib/admin/actions.json"},"source":"https://github.com/django/django/blob/stable/2.2.x/docs/ref/contrib/admin/actions.txt","official":"https://docs.djangoproject.com/fr/2.2/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","pt-br","ko","es","el","pl"]}