{"title":"Actions d’administration","version":"4.0","locale":"fr","docname":"ref/contrib/admin/actions","url":"/fr/4.0/ref/contrib/admin/actions/","canonical":"https://djangodocs.dev/fr/4.0/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 ».","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 » – des 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/4.0/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> intégrée dans Django :</p>\n<img alt=\"/fr/4.0/_images/admin-actions.png\" src=\"/fr/4.0/_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/4.0/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> pour des raisons d’efficacité, entraînant une importante mise en garde : la méthode <code class=\"docutils literal notranslate\">delete()</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/4.0/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> ou écrire une action personnalisée qui s’occupe de la suppression à votre manière – par exemple, en appelant <code class=\"docutils literal notranslate\">Model.delete()</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/4.0/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 de nouvelles avec un modèle <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=\"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=\"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>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 des fonctions ordinaires qui acceptent trois paramètres :</p>\n<ul class=\"simple\">\n<li><p>La classe <a class=\"reference internal\" href=\"/fr/4.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> concernée</p></li>\n<li><p>Un objet <a class=\"reference internal\" href=\"/fr/4.0/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\">HttpRequest</code></a> représentant la requête actuelle</p></li>\n<li><p>Un jeu de requête <a class=\"reference internal\" href=\"/fr/4.0/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> 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/4.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</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=\"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=\"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/4.0/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 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> 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>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 utilisant le décorateur <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> sur la fonction <code class=\"docutils literal notranslate\">make_published</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\n<span class=\"o\">...</span>\n\n<span class=\"nd\">@admin</span><span class=\"o\">.</span>action<span class=\"p\">(</span>description<span class=\"o\">=</span><span class=\"s1\">&#39;Mark selected stories as published&#39;</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=\"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>Cela peut sembler familier ; l’option d’administration <a class=\"reference internal\" href=\"/fr/4.0/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> utilise aussi une technique similaire avec le décorateur <a class=\"reference internal\" href=\"/fr/4.0/ref/contrib/admin/#django.contrib.admin.display\" title=\"django.contrib.admin.display\"><code class=\"xref py py-func docutils literal notranslate\">display()</code></a> pour fournir des descriptions conviviales pour les fonctions de rappel qui y sont inscrites.</p>\n</aside>\n<aside class=\"version-note version-changed\" data-version=\"3.2\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 3.2</p><p>L’argument <code class=\"docutils literal notranslate\">description</code> du décorateur <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> équivaut à définir l’attribut <code class=\"docutils literal notranslate\">short_description</code> directement sur la fonction d’action, ce qui se faisait dans les versions précédentes. Cette pratique est toujours prise en charge pour des raisons de rétrocompatibilité.</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/4.0/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\">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/4.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> de l’action. Cela fonctionne comme n’importe quelle autre option de configuration. Ainsi, le fichier <code class=\"docutils literal notranslate\">admin.py</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=\"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<span class=\"nd\">@admin</span><span class=\"o\">.</span>action<span class=\"p\">(</span>description<span class=\"o\">=</span><span class=\"s1\">&#39;Mark selected stories as published&#39;</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=\"s1\">&#39;p&#39;</span><span class=\"p\">)</span>\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=\"s1\">&#39;title&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;status&#39;</span><span class=\"p\">]</span>\n    ordering <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;title&#39;</span><span class=\"p\">]</span>\n    actions <span class=\"o\">=</span> <span class=\"p\">[</span>make_published<span class=\"p\">]</span>\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>Avec ce code, la liste d’objets à modifier dans l’interface d’administration ressemble à ceci :</p>\n<img alt=\"/fr/4.0/_images/adding-actions-to-the-modeladmin.png\" src=\"/fr/4.0/_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 couvre 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/4.0/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> 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/4.0/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\">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\">make_published</code> définie comme une fonction. 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\">Article</code>, il paraît logique de fusionner l’action dans l’objet <code class=\"docutils literal notranslate\">ArticleAdmin</code> même.</p>\n<p>Vous pouvez le faire comme ceci</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=\"s1\">&#39;make_published&#39;</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=\"s1\">&#39;Mark selected stories as published&#39;</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=\"s1\">&#39;p&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Remarquez d’abord que nous avons transformé <code class=\"docutils literal notranslate\">make_published</code> en une méthode et renommé le paramètre <code class=\"docutils literal notranslate\">modeladmin</code> à <code class=\"docutils literal notranslate\">self</code>, puis que nous avons placé la chaîne <code class=\"docutils literal notranslate\">make_published</code> dans <code class=\"docutils literal notranslate\">actions</code> à la place d’une référence de fonction directe. Cela indique à <a class=\"reference internal\" href=\"/fr/4.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</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 idiomatique à la classe <a class=\"reference internal\" href=\"/fr/4.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</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\">self</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=\"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<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=\"s1\">&#39;p&#39;</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>message_user<span class=\"p\">(</span>request<span class=\"p\">,</span> ngettext<span class=\"p\">(</span>\n            <span class=\"s1\">&#39;</span><span class=\"si\">%d</span><span class=\"s1\"> story was successfully marked as published.&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;</span><span class=\"si\">%d</span><span class=\"s1\"> stories were successfully marked as published.&#39;</span><span class=\"p\">,</span>\n            updated<span class=\"p\">,</span>\n        <span class=\"p\">)</span> <span class=\"o\">%</span> updated<span class=\"p\">,</span> messages<span class=\"o\">.</span>SUCCESS<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/4.0/_images/actions-as-modeladmin-methods.png\" src=\"/fr/4.0/_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 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, renvoyez une réponse <a class=\"reference internal\" href=\"/fr/4.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\">HttpResponse</code></a> (ou une sous-classe) depuis votre action. Par exemple, vous pourriez écrire une fonction d’exportation qui utilise les <a class=\"reference internal\" href=\"/fr/4.0/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=\"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<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>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/4.0/ref/request-response/#django.http.HttpResponseRedirect\" title=\"django.http.HttpResponseRedirect\"><code class=\"xref py py-class docutils literal notranslate\">HttpResponseRedirect</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 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=\"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<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=\"s1\">&#39;pk&#39;</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><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        ct<span class=\"o\">.</span>pk<span class=\"p\">,</span>\n        <span class=\"s1\">&#39;,&#39;</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</code></pre></div>\n<p>Comme vous pouvez le voir, l’action est plutôt succinte ; 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\">ContentType</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\">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\">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\">AdminSite.add_action()</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=\"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>Cela rend l’action <code class=\"docutils literal notranslate\">export_selected_objects</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\">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=\"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\">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\">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\">AdminSite.disable_action()</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>admin<span class=\"o\">.</span>site<span class=\"o\">.</span>disable_action<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\">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=\"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=\"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=\"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=\"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=\"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/4.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</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/4.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> donnée, définissez <a class=\"reference internal\" href=\"/fr/4.0/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>Cela indique à la classe <a class=\"reference internal\" href=\"/fr/4.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</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\">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\">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\">ModelAdmin.get_actions()</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\">(fonction, nom, description courte)</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=\"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=\"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> actions<span class=\"p\">:</span>\n                <span class=\"k\">del</span> actions<span class=\"p\">[</span><span class=\"s1\">&#39;delete_selected&#39;</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>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<p>Les actions peuvent restreindre leur accès aux utilisateurs ayant des permissions particulières en enveloppant leur fonction d’action dans le décorateur <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> et en lui passant l’argument <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=\"s1\">&#39;change&#39;</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=\"s1\">&#39;p&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>L’action <code class=\"docutils literal notranslate\">make_published()</code> ne sera disponible que pour les utilisateurs qui passent le contrôle <a class=\"reference internal\" href=\"/fr/4.0/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>Si <code class=\"docutils literal notranslate\">permissions</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\">permissions</code> et leur méthodes de contrôle correspondantes sont :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">'add'</code> (ajout) : <a class=\"reference internal\" href=\"/fr/4.0/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> (modification) : <a class=\"reference internal\" href=\"/fr/4.0/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> (suppression) : <a class=\"reference internal\" href=\"/fr/4.0/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> (affichage) : <a class=\"reference internal\" href=\"/fr/4.0/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>Vous pouvez indiquer d’autres valeurs pour autant que vous implémentiez une méthode correspondante <code class=\"docutils literal notranslate\">has_&lt;valeur&gt;_permission(self, request)</code> pour la classe <code class=\"docutils literal notranslate\">ModelAdmin</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=\"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<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=\"s1\">&#39;make_published&#39;</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=\"s1\">&#39;publish&#39;</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=\"s1\">&#39;p&#39;</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=\"s1\">&#39;publish&#39;</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=\"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>opts<span class=\"o\">.</span>app_label<span class=\"p\">,</span> codename<span class=\"p\">))</span>\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"3.2\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 3.2</p><p>L’argument <code class=\"docutils literal notranslate\">permissions</code> du décorateur <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> équivaut à définir l’attribut <code class=\"docutils literal notranslate\">allowed_permissions</code> directement sur la fonction d’action, ce qui se faisait dans les versions précédentes. Cette pratique est toujours prise en charge pour des raisons de rétrocompatibilité.</p>\n</aside>\n</section>\n</section>\n<section id=\"the-action-decorator\">\n<h2>Le décorateur <code class=\"docutils literal notranslate\">action</code><a class=\"heading-anchor\" href=\"#the-action-decorator\"><span class=\"visually-hidden\">Lien vers cette rubrique</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\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"3.2\" role=\"note\">\n<p class=\"version-note-title\">New in Django 3.2</p></aside>\n<p>Ce décorateur permet de définir des attributs spécifiques sur les fonctions d’action personnalisées pouvant être utilisée dans <a class=\"reference internal\" href=\"/fr/4.0/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=\"s1\">&#39;publish&#39;</span><span class=\"p\">],</span>\n    description<span class=\"o\">=</span><span class=\"s1\">&#39;Mark selected stories as published&#39;</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=\"s1\">&#39;p&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Ceci équivaut à définir certains attributs directement sur la fonction (avec les noms originaux, plus longs)</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=\"s1\">&#39;p&#39;</span><span class=\"p\">)</span>\nmake_published<span class=\"o\">.</span>allowed_permissions <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;publish&#39;</span><span class=\"p\">]</span>\nmake_published<span class=\"o\">.</span>short_description <span class=\"o\">=</span> <span class=\"s1\">&#39;Mark selected stories as published&#39;</span>\n</code></pre></div>\n<p>L’utilisation de ce décorateur n’est pas obligatoire pour créer une fonction d’action, mais il peut être utile de l’utiliser sans argument dans votre code source comme marqueur de mise en évidence du but de la fonction</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>Dans cas, aucun attribut ne sera ajouté à la fonction.</p>\n</dd></dl>\n\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":[]}]},{"title":"Le décorateur action","anchor":"the-action-decorator","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/4.0/ref/"},{"docname":"ref/contrib/index","title":"Paquets contrib","url":"/fr/4.0/ref/contrib/"},{"docname":"ref/contrib/admin/index","title":"Le site d’administration de Django","url":"/fr/4.0/ref/contrib/admin/"}],"prev":{"docname":"ref/contrib/admin/index","title":"Le site d’administration de Django","url":"/fr/4.0/ref/contrib/admin/"},"next":{"docname":"ref/contrib/admin/admindocs","title":"Le générateur de documentation de l’administration de Django","url":"/fr/4.0/ref/contrib/admin/admindocs/"},"formats":{"html":"/fr/4.0/ref/contrib/admin/actions/","markdown":"/fr/4.0/ref/contrib/admin/actions.md","json":"/fr/4.0/ref/contrib/admin/actions.json"},"source":"https://github.com/django/django/blob/stable/4.0.x/docs/ref/contrib/admin/actions.txt","official":"https://docs.djangoproject.com/fr/4.0/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"]}