{"title":"Signaux","version":"1.9","locale":"fr","docname":"ref/signals","url":"/fr/1.9/ref/signals/","canonical":"https://djangodocs.dev/fr/1.9/ref/signals/","summary":"A list of all the signals that Django sends. All built-in signals are sent using the send() method.","html":"<h1>Signaux<a class=\"heading-anchor\" href=\"#signals\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>A list of all the signals that Django sends. All built-in signals are sent\nusing the <a class=\"reference internal\" href=\"/fr/1.9/topics/signals/#django.dispatch.Signal.send\" title=\"django.dispatch.Signal.send\"><code class=\"xref py py-meth docutils literal notranslate\">send()</code></a> method.</p>\n<aside class=\"admonition admonition-seealso\" role=\"note\">\n<p class=\"admonition-title\">Voir aussi</p>\n<p>Consultez la documentation sur la <a class=\"reference internal\" href=\"/fr/1.9/topics/signals/\"><span class=\"doc\">distribution de signaux</span></a> pour plus d’informations sur la façon d’inscrire et de recevoir des signaux.</p>\n<p>Le <a class=\"reference internal\" href=\"/fr/1.9/topics/auth/\"><span class=\"doc\">système d’authentification</span></a> envoie des <a class=\"reference internal\" href=\"/fr/1.9/ref/contrib/auth/#topics-auth-signals\"><span class=\"std std-ref\">signaux lorsqu’un utilisateur se connecte ou se déconnecte</span></a>.</p>\n</aside>\n<section id=\"module-django.db.models.signals\">\n<span id=\"model-signals\"></span><h2>Signaux de modèle<a class=\"heading-anchor\" href=\"#module-django.db.models.signals\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Le module <a class=\"reference internal\" href=\"#module-django.db.models.signals\" title=\"django.db.models.signals: Signals sent by the model system.\"><code class=\"xref py py-mod docutils literal notranslate\">django.db.models.signals</code></a> définit un ensemble de signaux envoyés par le système des modèles.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Beaucoup de ces signaux sont envoyés par différentes méthodes de modèle comme <code class=\"docutils literal notranslate\">__init__()</code> ou <a class=\"reference internal\" href=\"/fr/1.9/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a>. Ces méthodes peuvent être surchargées dans votre propre code.</p>\n<p>Si vous surchargez ces méthodes dans un de vos modèles, vous devez appeler la méthode de la classe parente si vous voulez que les signaux soient envoyés.</p>\n<p>Notez également que Django stocke les gestionnaires de signaux comme référence faible par défaut. Cela signifie que si le récepteur est une fonction locale, il peut être purgé de la mémoire. Pour empêcher cela, indiquez <code class=\"docutils literal notranslate\">weak=False</code> lors de l’appel à la méthode <a class=\"reference internal\" href=\"/fr/1.9/topics/signals/#django.dispatch.Signal.connect\" title=\"django.dispatch.Signal.connect\"><code class=\"xref py py-meth docutils literal notranslate\">connect()</code></a> du signal.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Le modèle <code class=\"docutils literal notranslate\">sender</code> des signaux de modèles peut être référencé de manière différée lors de la connexion à un récepteur en indiquant son étiquette d’application complète. Par exemple, un modèle <code class=\"docutils literal notranslate\">Answer</code> défini dans l’application <code class=\"docutils literal notranslate\">polls</code> peut être référencé en tant que <code class=\"docutils literal notranslate\">'polls.Answer'</code>. Ce type de référence peut être bien pratique lorsqu’on est confronté à des dépendances d’importation circulaire ou à des modèles interchangeables.</p>\n</aside>\n<section id=\"pre-init\">\n<h3><code class=\"docutils literal notranslate\">pre_init</code><a class=\"heading-anchor\" href=\"#pre-init\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.pre_init\">\n<span class=\"sig-prename descclassname\">django.db.models.signals.</span><span class=\"sig-name descname\">pre_init</span><a class=\"heading-anchor\" href=\"#django.db.models.signals.pre_init\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Lors de chaque instanciation d’un modèle Django, ce signal est envoyé au début de la méthode <code class=\"docutils literal notranslate\">__init__()</code> du modèle.</p>\n<p>Paramètres envoyés avec ce signal :</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\">sender</code></dt><dd><p>La classe de modèle dont une instance vient d’être créée.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">args</code></dt><dd><p>Une liste de paramètres positionnels transmis à <code class=\"docutils literal notranslate\">__init__()</code>:</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">kwargs</code></dt><dd><p>Un dictionnaire de paramètres nommés transmis à <code class=\"docutils literal notranslate\">__init__()</code>:</p>\n</dd>\n</dl>\n<p>Par exemple, le <a class=\"reference internal\" href=\"/fr/1.9/intro/tutorial01/\"><span class=\"doc\">tutoriel</span></a> contient cette ligne :</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>p <span class=\"o\">=</span> Poll<span class=\"p\">(</span>question<span class=\"o\">=</span><span class=\"s2\">&quot;What&#39;s up?&quot;</span><span class=\"p\">,</span> pub_date<span class=\"o\">=</span>datetime<span class=\"o\">.</span>now<span class=\"p\">())</span>\n</code></pre></div>\n<p>Les paramètres envoyés au gestionnaire <a class=\"reference internal\" href=\"#django.db.models.signals.pre_init\" title=\"django.db.models.signals.pre_init\"><code class=\"xref py py-data docutils literal notranslate\">pre_init</code></a> sont :</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>Paramètre</p></th>\n<th class=\"head\"><p>Valeur</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\">sender</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">Poll</code> (la classe elle-même)</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\">args</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">[]</code> (une liste vide, car aucun paramètre positionnel n’a été transmis à <code class=\"docutils literal notranslate\">__init__()</code>)</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\">kwargs</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">{'question': &quot;What's up?&quot;, 'pub_date': datetime.now()}</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n</section>\n<section id=\"post-init\">\n<h3><code class=\"docutils literal notranslate\">post_init</code><a class=\"heading-anchor\" href=\"#post-init\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.post_init\">\n<span class=\"sig-prename descclassname\">django.db.models.signals.</span><span class=\"sig-name descname\">post_init</span><a class=\"heading-anchor\" href=\"#django.db.models.signals.post_init\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Comme <code class=\"docutils literal notranslate\">pre_init</code>, mais celui-ci est envoyé lorsque la méthode <code class=\"docutils literal notranslate\">__init__()</code> se termine.</p>\n<p>Paramètres envoyés avec ce signal :</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\">sender</code></dt><dd><p>Comme ci-dessus : la classe de modèle dont une instance vient d’être créée.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">instance</code></dt><dd><p>L’instance de modèle réelle qui vient d’être créée.</p>\n</dd>\n</dl>\n</section>\n<section id=\"pre-save\">\n<h3><code class=\"docutils literal notranslate\">pre_save</code><a class=\"heading-anchor\" href=\"#pre-save\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.pre_save\">\n<span class=\"sig-prename descclassname\">django.db.models.signals.</span><span class=\"sig-name descname\">pre_save</span><a class=\"heading-anchor\" href=\"#django.db.models.signals.pre_save\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Envoyé au début de la méthode <a class=\"reference internal\" href=\"/fr/1.9/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a> d’un modèle.</p>\n<p>Paramètres envoyés avec ce signal :</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\">sender</code></dt><dd><p>La classe de modèle.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">instance</code></dt><dd><p>L’instance réelle en cours d’enregistrement.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">raw</code></dt><dd><p>Valeur booléenne ; <code class=\"docutils literal notranslate\">True</code> si le modèle est enregistré exactement comme présenté (par ex. lors du chargement d’un instantané). Il ne faut pas interroger ou modifier d’autres enregistrements de la base de données, car celle-ci pourrait se trouver provisoirement dans un état non cohérent.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">using</code></dt><dd><p>L’alias de base de données utilisé.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">update_fields</code></dt><dd><p>The set of fields to update as passed to <a class=\"reference internal\" href=\"/fr/1.9/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">Model.save()</code></a>, or <code class=\"docutils literal notranslate\">None</code>\nif <code class=\"docutils literal notranslate\">update_fields</code> wasn’t passed to <code class=\"docutils literal notranslate\">save()</code>.</p>\n</dd>\n</dl>\n</section>\n<section id=\"post-save\">\n<h3><code class=\"docutils literal notranslate\">post_save</code><a class=\"heading-anchor\" href=\"#post-save\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.post_save\">\n<span class=\"sig-prename descclassname\">django.db.models.signals.</span><span class=\"sig-name descname\">post_save</span><a class=\"heading-anchor\" href=\"#django.db.models.signals.post_save\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Comme <a class=\"reference internal\" href=\"#django.db.models.signals.pre_save\" title=\"django.db.models.signals.pre_save\"><code class=\"xref py py-data docutils literal notranslate\">pre_save</code></a>, mais envoyé à la fin de la méthode <a class=\"reference internal\" href=\"/fr/1.9/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a>.</p>\n<p>Paramètres envoyés avec ce signal :</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\">sender</code></dt><dd><p>La classe de modèle.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">instance</code></dt><dd><p>L’instance réelle en cours d’enregistrement.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">created</code></dt><dd><p>Valeur booléenne ; <code class=\"docutils literal notranslate\">True</code> si un nouvel enregistrement a été créé.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">raw</code></dt><dd><p>Valeur booléenne ; <code class=\"docutils literal notranslate\">True</code> si le modèle est enregistré exactement comme présenté (par ex. lors du chargement d’un instantané). Il ne faut pas interroger ou modifier d’autres enregistrements de la base de données, car celle-ci pourrait se trouver provisoirement dans un état non cohérent.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">using</code></dt><dd><p>L’alias de base de données utilisé.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">update_fields</code></dt><dd><p>The set of fields to update as passed to <a class=\"reference internal\" href=\"/fr/1.9/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">Model.save()</code></a>, or <code class=\"docutils literal notranslate\">None</code>\nif <code class=\"docutils literal notranslate\">update_fields</code> wasn’t passed to <code class=\"docutils literal notranslate\">save()</code>.</p>\n</dd>\n</dl>\n</section>\n<section id=\"pre-delete\">\n<h3><code class=\"docutils literal notranslate\">pre_delete</code><a class=\"heading-anchor\" href=\"#pre-delete\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.pre_delete\">\n<span class=\"sig-prename descclassname\">django.db.models.signals.</span><span class=\"sig-name descname\">pre_delete</span><a class=\"heading-anchor\" href=\"#django.db.models.signals.pre_delete\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Envoyé au début de la méthode  <a class=\"reference internal\" href=\"/fr/1.9/ref/models/instances/#django.db.models.Model.delete\" title=\"django.db.models.Model.delete\"><code class=\"xref py py-meth docutils literal notranslate\">delete()</code></a> d’un modèle ou de la méthode <a class=\"reference internal\" href=\"/fr/1.9/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\">delete()</code></a> d’un <code class=\"docutils literal notranslate\">QuerySet</code>.</p>\n<p>Paramètres envoyés avec ce signal :</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\">sender</code></dt><dd><p>La classe de modèle.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">instance</code></dt><dd><p>L’instance réelle en cours de suppression.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">using</code></dt><dd><p>L’alias de base de données utilisé.</p>\n</dd>\n</dl>\n</section>\n<section id=\"post-delete\">\n<h3><code class=\"docutils literal notranslate\">post_delete</code><a class=\"heading-anchor\" href=\"#post-delete\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.post_delete\">\n<span class=\"sig-prename descclassname\">django.db.models.signals.</span><span class=\"sig-name descname\">post_delete</span><a class=\"heading-anchor\" href=\"#django.db.models.signals.post_delete\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Comme <a class=\"reference internal\" href=\"#django.db.models.signals.pre_delete\" title=\"django.db.models.signals.pre_delete\"><code class=\"xref py py-data docutils literal notranslate\">pre_delete</code></a>, mais envoyé à la fin de la méthode <a class=\"reference internal\" href=\"/fr/1.9/ref/models/instances/#django.db.models.Model.delete\" title=\"django.db.models.Model.delete\"><code class=\"xref py py-meth docutils literal notranslate\">delete()</code></a> d’un modèle ou de la méthode <a class=\"reference internal\" href=\"/fr/1.9/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\">delete()</code></a> d’un <code class=\"docutils literal notranslate\">QuerySet</code>.</p>\n<p>Paramètres envoyés avec ce signal :</p>\n<dl>\n<dt><code class=\"docutils literal notranslate\">sender</code></dt><dd><p>La classe de modèle.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">instance</code></dt><dd><p>L’instance réelle en cours de suppression.</p>\n<p>Notez que l’objet ne se trouve plus dans la base de données, soyez donc très prudent avec ce que vous faites de cette instance.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">using</code></dt><dd><p>L’alias de base de données utilisé.</p>\n</dd>\n</dl>\n</section>\n<section id=\"m2m-changed\">\n<h3><code class=\"docutils literal notranslate\">m2m_changed</code><a class=\"heading-anchor\" href=\"#m2m-changed\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.m2m_changed\">\n<span class=\"sig-prename descclassname\">django.db.models.signals.</span><span class=\"sig-name descname\">m2m_changed</span><a class=\"heading-anchor\" href=\"#django.db.models.signals.m2m_changed\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Envoyé lorsqu’un champ <a class=\"reference internal\" href=\"/fr/1.9/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> est modifié dans une instance de modèle. Strictement parlant, il ne s’agit pas d’un signal de modèle car il est envoyé par <a class=\"reference internal\" href=\"/fr/1.9/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a>, mais comme il complète les signaux <a class=\"reference internal\" href=\"#django.db.models.signals.pre_save\" title=\"django.db.models.signals.pre_save\"><code class=\"xref py py-data docutils literal notranslate\">pre_save</code></a>/<a class=\"reference internal\" href=\"#django.db.models.signals.post_save\" title=\"django.db.models.signals.post_save\"><code class=\"xref py py-data docutils literal notranslate\">post_save</code></a> et <a class=\"reference internal\" href=\"#django.db.models.signals.pre_delete\" title=\"django.db.models.signals.pre_delete\"><code class=\"xref py py-data docutils literal notranslate\">pre_delete</code></a>/<a class=\"reference internal\" href=\"#django.db.models.signals.post_delete\" title=\"django.db.models.signals.post_delete\"><code class=\"xref py py-data docutils literal notranslate\">post_delete</code></a> en ce qui concerne le suivi des modifications des modèles, nous l’avons inclus sous cette rubrique.</p>\n<p>Paramètres envoyés avec ce signal :</p>\n<dl>\n<dt><code class=\"docutils literal notranslate\">sender</code></dt><dd><p>La classe de modèles intermédiaire déterminant le champ <a class=\"reference internal\" href=\"/fr/1.9/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a>. Cette classe est automatiquement créée lors de la définition d’un champ plusieurs-à-plusieurs ; vous pouvez y accéder par l’attribut <code class=\"docutils literal notranslate\">through</code> du champ plusieurs-à-plusieurs.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">instance</code></dt><dd><p>L’instance dont la relation plusieurs-à-plusieurs est mise à jour. Cela peut être une instance de <code class=\"docutils literal notranslate\">sender</code> ou de la classe à laquelle est liée le champ <a class=\"reference internal\" href=\"/fr/1.9/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a>.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">action</code></dt><dd><p>Une chaîne indiquant le type de mise à jour effectuée sur la relation. Voici les valeurs possibles :</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\">&quot;pre_add&quot;</code></dt><dd><p>Envoyé <em>avant</em> qu’un ou plusieurs objets soient ajoutés à la relation.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">&quot;post_add&quot;</code></dt><dd><p>Envoyé <em>après</em> qu’un ou plusieurs objets ont été ajoutés à la relation.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">&quot;pre_remove&quot;</code></dt><dd><p>Envoyé <em>avant</em> qu’un ou plusieurs objets soient supprimés de la relation.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">&quot;post_remove&quot;</code></dt><dd><p>Envoyé <em>après</em> qu’un ou plusieurs objets ont été supprimés de la relation.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">&quot;pre_clear&quot;</code></dt><dd><p>Envoyé <em>avant</em> que la relation soit effacée.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">&quot;post_clear&quot;</code></dt><dd><p>Envoyé <em>après</em> que la relation a été effacée.</p>\n</dd>\n</dl>\n</dd>\n<dt><code class=\"docutils literal notranslate\">reverse</code></dt><dd><p>Indique quel côté de la relation est mis à jour (c’est-à-dire si c’est la relation directe ou inverse qui est en cours de modification).</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">model</code></dt><dd><p>La classe des objets qui sont ajoutés, supprimés ou retirés de la relation.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">pk_set</code></dt><dd><p>Pour les signaux <code class=\"docutils literal notranslate\">pre_add</code>, <code class=\"docutils literal notranslate\">post_add</code>, <code class=\"docutils literal notranslate\">pre_remove</code> et <code class=\"docutils literal notranslate\">post_remove</code>, il s’agit d’un ensemble de valeurs de clé primaire qui ont été ajoutées ou enlevées de la relation.</p>\n<p>Pour les signaux <code class=\"docutils literal notranslate\">pre_clear</code> et <code class=\"docutils literal notranslate\">post_clear</code> actions, cette valeur vaut <code class=\"docutils literal notranslate\">None</code>.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">using</code></dt><dd><p>L’alias de base de données utilisé.</p>\n</dd>\n</dl>\n<p>Par exemple, si une <code class=\"docutils literal notranslate\">Pizza</code> peut comporter plusieurs objets <code class=\"docutils literal notranslate\">Topping</code>, selon ce modèle :</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\">Topping</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">Pizza</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    toppings <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>Topping<span class=\"p\">)</span>\n</code></pre></div>\n<p>Si nous connectons un gestionnaire 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=\"kn\">from</span> <span class=\"nn\">django.db.models.signals</span> <span class=\"kn\">import</span> m2m_changed\n\n<span class=\"k\">def</span> <span class=\"nf\">toppings_changed</span><span class=\"p\">(</span>sender<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n    <span class=\"c1\"># Do something</span>\n    <span class=\"k\">pass</span>\n\nm2m_changed<span class=\"o\">.</span>connect<span class=\"p\">(</span>toppings_changed<span class=\"p\">,</span> sender<span class=\"o\">=</span>Pizza<span class=\"o\">.</span>toppings<span class=\"o\">.</span>through<span class=\"p\">)</span>\n</code></pre></div>\n<p>puis que nous faisons quelque chose comme ç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=\"gp\">&gt;&gt;&gt; </span>p <span class=\"o\">=</span> Pizza<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>t <span class=\"o\">=</span> Topping<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p<span class=\"o\">.</span>toppings<span class=\"o\">.</span>add<span class=\"p\">(</span>t<span class=\"p\">)</span>\n</code></pre></div>\n<p>les paramètres envoyés à un gestionnaire <a class=\"reference internal\" href=\"#django.db.models.signals.m2m_changed\" title=\"django.db.models.signals.m2m_changed\"><code class=\"xref py py-data docutils literal notranslate\">m2m_changed</code></a> (<code class=\"docutils literal notranslate\">toppings_changed</code> dans l’exemple ci-dessus) seraient :</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>Paramètre</p></th>\n<th class=\"head\"><p>Valeur</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\">sender</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">Pizza.toppings.through</code> (la classe plusieurs-à-plusieurs intermédiaire)</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\">instance</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">p</code> (l’instance <code class=\"docutils literal notranslate\">Pizza</code> en cours de modification)</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\">action</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">&quot;pre_add&quot;</code> (suivi d’un autre signal avec <code class=\"docutils literal notranslate\">&quot;post_add&quot;</code>)</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\">reverse</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">False</code> (<code class=\"docutils literal notranslate\">Pizza</code> contient le champ <a class=\"reference internal\" href=\"/fr/1.9/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a>, ce qui fait que cette fonction modifie la relation directe)</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\">model</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">Topping</code> (la classe des objets ajoutés à <code class=\"docutils literal notranslate\">Pizza</code>)</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\">pk_set</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">{t.id}</code> (car seul <code class=\"docutils literal notranslate\">Topping t</code> a été ajouté à la relation)</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\">using</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">&quot;default&quot;</code> (parce que le routeur par défaut dirige les écritures à cette destination)</p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>Et si nous faisions ensuite quelque chose 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=\"gp\">&gt;&gt;&gt; </span>t<span class=\"o\">.</span>pizza_set<span class=\"o\">.</span>remove<span class=\"p\">(</span>p<span class=\"p\">)</span>\n</code></pre></div>\n<p>les paramètres envoyés à un gestionnaire <a class=\"reference internal\" href=\"#django.db.models.signals.m2m_changed\" title=\"django.db.models.signals.m2m_changed\"><code class=\"xref py py-data docutils literal notranslate\">m2m_changed</code></a> seraient :</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>Paramètre</p></th>\n<th class=\"head\"><p>Valeur</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\">sender</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">Pizza.toppings.through</code> (la classe plusieurs-à-plusieurs intermédiaire)</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\">instance</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">t</code> (l’instance <code class=\"docutils literal notranslate\">Topping</code> en cours de modification)</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\">action</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">&quot;pre_remove&quot;</code> (suivi d’un autre signal avec <code class=\"docutils literal notranslate\">&quot;post_remove&quot;</code>)</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\">reverse</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">True</code> (c’est <code class=\"docutils literal notranslate\">Pizza</code> qui contient le champ <a class=\"reference internal\" href=\"/fr/1.9/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a>, ce qui fait que cette fonction modifie la relation inverse)</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\">model</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">Pizza</code> (la classe des objets retirés de <code class=\"docutils literal notranslate\">Topping</code>)</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\">pk_set</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">{p.id}</code> (car seul <code class=\"docutils literal notranslate\">Pizza p</code> a été enlevé de la relation)</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\">using</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">&quot;default&quot;</code> (parce que le routeur par défaut dirige les écritures à cette destination)</p></td>\n</tr>\n</tbody>\n</table>\n</div>\n</section>\n<section id=\"class-prepared\">\n<h3><code class=\"docutils literal notranslate\">class_prepared</code><a class=\"heading-anchor\" href=\"#class-prepared\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.class_prepared\">\n<span class=\"sig-prename descclassname\">django.db.models.signals.</span><span class=\"sig-name descname\">class_prepared</span><a class=\"heading-anchor\" href=\"#django.db.models.signals.class_prepared\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Envoyé chaque fois qu’une classe de modèle a été « préparée », c’est-à-dire après que le modèle a été défini et inscrit dans le système des modèles de Django. Django utilise ce signal en interne ; il n’est généralement pas utilisé dans des applications tierces.</p>\n<p>Comme ce signal est envoyé durant le processus de remplissage du registre des applications et que <a class=\"reference internal\" href=\"/fr/1.9/ref/applications/#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\">AppConfig.ready()</code></a> s’exécute après la fin de ce remplissage, les récepteurs ne peuvent pas être connectés dans cette méthode. Une possibilité est de les connecter dans <code class=\"docutils literal notranslate\">AppConfig.__init__()</code> en prenant soi de ne pas importer de modèles ni de déclencher des appels au registre des applications.</p>\n<p>Paramètres envoyés avec ce signal :</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\">sender</code></dt><dd><p>La classe de modèle qui vient d’être préparée.</p>\n</dd>\n</dl>\n</section>\n</section>\n<section id=\"management-signals\">\n<h2>Signaux de gestion<a class=\"heading-anchor\" href=\"#management-signals\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Signaux envoyés par <a class=\"reference internal\" href=\"/fr/1.9/ref/django-admin/\"><span class=\"doc\">django-admin</span></a>.</p>\n<section id=\"pre-migrate\">\n<h3><code class=\"docutils literal notranslate\">pre_migrate</code><a class=\"heading-anchor\" href=\"#pre-migrate\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.pre_migrate\">\n<span class=\"sig-prename descclassname\">django.db.models.signals.</span><span class=\"sig-name descname\">pre_migrate</span><a class=\"heading-anchor\" href=\"#django.db.models.signals.pre_migrate\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Envoyé par la commande <a class=\"reference internal\" href=\"/fr/1.9/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> afin le début de l’installation d’une application. Il n’est pas émis pour les applications qui n’ont pas de module <code class=\"docutils literal notranslate\">models</code>.</p>\n<p>Paramètres envoyés avec ce signal :</p>\n<dl>\n<dt><code class=\"docutils literal notranslate\">sender</code></dt><dd><p>Une instance <a class=\"reference internal\" href=\"/fr/1.9/ref/applications/#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> de l’application sur le point d’être migrée/synchronisée.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">app_config</code></dt><dd><p>Identique à <code class=\"docutils literal notranslate\">sender</code>.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">verbosity</code></dt><dd><p>Indique la quantité d’informations que <code class=\"docutils literal notranslate\">manage.py</code> affiche à l’écran. Voir l’option <a class=\"reference internal\" href=\"/fr/1.9/ref/django-admin/#cmdoption-verbosity\"><code class=\"xref std std-option docutils literal notranslate\">--verbosity</code></a> pour plus de détails.</p>\n<p>Les fonctions à l’écoute de <a class=\"reference internal\" href=\"#django.db.models.signals.pre_migrate\" title=\"django.db.models.signals.pre_migrate\"><code class=\"xref py py-data docutils literal notranslate\">pre_migrate</code></a> devraient ajuster ce qu’elles affichent en fonction de la valeur de ce paramètre.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">interactive</code></dt><dd><p>Si <code class=\"docutils literal notranslate\">interactive</code> vaut <code class=\"docutils literal notranslate\">True</code>, il est tout à fait possible de demander à l’utilisateur de saisir des informations sur la ligne de commande. Si <code class=\"docutils literal notranslate\">interactive</code> vaut <code class=\"docutils literal notranslate\">False</code>, les fonctions à l’écoute de ce signal ne doivent pas du tout interroger l’utilisateur.</p>\n<p>Par exemple, l’application <a class=\"reference internal\" href=\"/fr/1.9/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> ne demande les informations de création du super-utilisateur que lorsqu”<code class=\"docutils literal notranslate\">interactive</code> vaut <code class=\"docutils literal notranslate\">True</code>.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">using</code></dt><dd><p>L’alias de base de données sur laquelle une commande va agir.</p>\n</dd>\n</dl>\n</section>\n<section id=\"post-migrate\">\n<h3><code class=\"docutils literal notranslate\">post_migrate</code><a class=\"heading-anchor\" href=\"#post-migrate\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.signals.post_migrate\">\n<span class=\"sig-prename descclassname\">django.db.models.signals.</span><span class=\"sig-name descname\">post_migrate</span><a class=\"heading-anchor\" href=\"#django.db.models.signals.post_migrate\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Envoyé par la commande <a class=\"reference internal\" href=\"/fr/1.9/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> après que celle-ci a installé une application, et après la commande <a class=\"reference internal\" href=\"/fr/1.9/ref/django-admin/#django-admin-flush\"><code class=\"xref std std-djadmin docutils literal notranslate\">flush</code></a>. Il n’est pas émis pour les applications qui n’ont pas de module <code class=\"docutils literal notranslate\">models</code>.</p>\n<p>Il est important que les gestionnaires de ce signal effectuent des modifications idempotentes (c’est-à-dire pas de modification de base de données) car cela pourrait provoquer l’échec de la commande de gestion <a class=\"reference internal\" href=\"/fr/1.9/ref/django-admin/#django-admin-flush\"><code class=\"xref std std-djadmin docutils literal notranslate\">flush</code></a> si elle s’exécute aussi pendant la commande <a class=\"reference internal\" href=\"/fr/1.9/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a>.</p>\n<p>Paramètres envoyés avec ce signal :</p>\n<dl>\n<dt><code class=\"docutils literal notranslate\">sender</code></dt><dd><p>Une instance <a class=\"reference internal\" href=\"/fr/1.9/ref/applications/#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> de l’application qui vient d’être installée.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">app_config</code></dt><dd><p>Identique à <code class=\"docutils literal notranslate\">sender</code>.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">verbosity</code></dt><dd><p>Indique la quantité d’informations que <code class=\"docutils literal notranslate\">manage.py</code> affiche à l’écran. Voir l’option <a class=\"reference internal\" href=\"/fr/1.9/ref/django-admin/#cmdoption-verbosity\"><code class=\"xref std std-option docutils literal notranslate\">--verbosity</code></a> pour plus de détails.</p>\n<p>Les fonctions à l’écoute de <a class=\"reference internal\" href=\"#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\">post_migrate</code></a> devraient ajuster ce qu’elles affichent en fonction de la valeur de ce paramètre.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">interactive</code></dt><dd><p>Si <code class=\"docutils literal notranslate\">interactive</code> vaut <code class=\"docutils literal notranslate\">True</code>, il est tout à fait possible de demander à l’utilisateur de saisir des informations sur la ligne de commande. Si <code class=\"docutils literal notranslate\">interactive</code> vaut <code class=\"docutils literal notranslate\">False</code>, les fonctions à l’écoute de ce signal ne doivent pas du tout interroger l’utilisateur.</p>\n<p>Par exemple, l’application <a class=\"reference internal\" href=\"/fr/1.9/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> ne demande les informations de création du super-utilisateur que lorsqu”<code class=\"docutils literal notranslate\">interactive</code> vaut <code class=\"docutils literal notranslate\">True</code>.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">using</code></dt><dd><p>L’alias de base de données utilisé pour la synchronisation. La valeur par défaut correspond à la base de données <code class=\"docutils literal notranslate\">default</code>.</p>\n</dd>\n</dl>\n<p>Par exemple, il est possible d’inscrire une fonction de rappel dans une classe <a class=\"reference internal\" href=\"/fr/1.9/ref/applications/#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> 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=\"kn\">from</span> <span class=\"nn\">django.apps</span> <span class=\"kn\">import</span> AppConfig\n<span class=\"kn\">from</span> <span class=\"nn\">django.db.models.signals</span> <span class=\"kn\">import</span> post_migrate\n\n<span class=\"k\">def</span> <span class=\"nf\">my_callback</span><span class=\"p\">(</span>sender<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n    <span class=\"c1\"># Your specific logic here</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">MyAppConfig</span><span class=\"p\">(</span>AppConfig<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">ready</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        post_migrate<span class=\"o\">.</span>connect<span class=\"p\">(</span>my_callback<span class=\"p\">,</span> sender<span class=\"o\">=</span><span class=\"bp\">self</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>Si vous fournissez une instance <a class=\"reference internal\" href=\"/fr/1.9/ref/applications/#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> comme paramètre <code class=\"docutils literal notranslate\">sender</code>, contrôlez bien que le signal est inscrit dans la méthode <a class=\"reference internal\" href=\"/fr/1.9/ref/applications/#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\">ready()</code></a>. Des instances <code class=\"docutils literal notranslate\">AppConfig</code> sont recréées pour les tests qui fonctionnent avec un réglage <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> modifié (comme quand les réglages sont temporairement surchargés) et de tels signaux doivent alors être connectés pour chaque nouvelle instance de <code class=\"docutils literal notranslate\">AppConfig</code>.</p>\n</aside>\n</section>\n</section>\n<section id=\"module-django.core.signals\">\n<span id=\"request-response-signals\"></span><h2>Signaux de requête et de réponse<a class=\"heading-anchor\" href=\"#module-django.core.signals\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Signaux envoyés par le système de base lors du traitement d’une requête.</p>\n<section id=\"request-started\">\n<h3><code class=\"docutils literal notranslate\">request_started</code><a class=\"heading-anchor\" href=\"#request-started\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.core.signals.request_started\">\n<span class=\"sig-prename descclassname\">django.core.signals.</span><span class=\"sig-name descname\">request_started</span><a class=\"heading-anchor\" href=\"#django.core.signals.request_started\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Envoyé lorsque Django commence à traiter une requête HTTP.</p>\n<p>Paramètres envoyés avec ce signal :</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\">sender</code></dt><dd><p>La classe de gestion – par ex. <code class=\"docutils literal notranslate\">django.core.handlers.wsgi.WsgiHandler</code> – qui est chargée de la requête.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">environ</code></dt><dd><p>Le dictionnaire <code class=\"docutils literal notranslate\">environ</code> fourni à la requête.</p>\n</dd>\n</dl>\n<aside class=\"version-note version-changed\" data-version=\"1.8\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 1.8</p><p>Le paramètre <code class=\"docutils literal notranslate\">environ</code> a été ajouté.</p>\n</aside>\n</section>\n<section id=\"request-finished\">\n<h3><code class=\"docutils literal notranslate\">request_finished</code><a class=\"heading-anchor\" href=\"#request-finished\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.core.signals.request_finished\">\n<span class=\"sig-prename descclassname\">django.core.signals.</span><span class=\"sig-name descname\">request_finished</span><a class=\"heading-anchor\" href=\"#django.core.signals.request_finished\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Envoyé lorsque Django a terminé l’envoi d’une réponse HTTP à un client.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Certains serveurs et intergiciels WSGI n’appellent pas toujours <code class=\"docutils literal notranslate\">close</code> sur la réponse après avoir traité une requête, notamment uWSGI avant la version 1.2.6 et l’intergiciel de signalement d’erreurs de Sentry jusqu’à la version 2.0.7. Dans ces cas, ce signal n’est pas envoyé du tout. Par conséquent, il se peut que des connexions de base de données et de serveurs memcache puissent être laissées ouvertes.</p>\n</aside>\n<p>Paramètres envoyés avec ce signal :</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\">sender</code></dt><dd><p>La classe de gestion, comme ci-dessus.</p>\n</dd>\n</dl>\n</section>\n<section id=\"got-request-exception\">\n<h3><code class=\"docutils literal notranslate\">got_request_exception</code><a class=\"heading-anchor\" href=\"#got-request-exception\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.core.signals.got_request_exception\">\n<span class=\"sig-prename descclassname\">django.core.signals.</span><span class=\"sig-name descname\">got_request_exception</span><a class=\"heading-anchor\" href=\"#django.core.signals.got_request_exception\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Ce signal est envoyé chaque fois que Django rencontre une exception lors du traitement d’une requête HTTP entrante.</p>\n<p>Paramètres envoyés avec ce signal :</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\">sender</code></dt><dd><p>La classe de gestion, comme ci-dessus.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">request</code></dt><dd><p>L’objet <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\">HttpRequest</code></a>.</p>\n</dd>\n</dl>\n</section>\n</section>\n<section id=\"module-django.test.signals\">\n<span id=\"test-signals\"></span><h2>Signaux de test<a class=\"heading-anchor\" href=\"#module-django.test.signals\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ces signaux ne sont envoyés que lors du <a class=\"reference internal\" href=\"/fr/1.9/topics/testing/overview/#running-tests\"><span class=\"std std-ref\">fonctionnement des tests</span></a>.</p>\n<section id=\"setting-changed\">\n<h3><code class=\"docutils literal notranslate\">setting_changed</code><a class=\"heading-anchor\" href=\"#setting-changed\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.test.signals.setting_changed\">\n<span class=\"sig-prename descclassname\">django.test.signals.</span><span class=\"sig-name descname\">setting_changed</span><a class=\"heading-anchor\" href=\"#django.test.signals.setting_changed\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Ce signal est envoyé lorsque la valeur d’un réglage a été modifiée par le gestionnaire de contexte <code class=\"docutils literal notranslate\">django.test.TestCase.settings()</code> ou le décorateur/gestionnaire de contexte <a class=\"reference internal\" href=\"/fr/1.9/topics/testing/tools/#django.test.override_settings\" title=\"django.test.override_settings\"><code class=\"xref py py-func docutils literal notranslate\">django.test.override_settings()</code></a>.</p>\n<p>En fait, il est envoyé deux fois : lorsque la nouvelle valeur est appliquée (« setup ») et lorsque la valeur originale est restaurée (« teardown »). Utilisez le paramètre <code class=\"docutils literal notranslate\">enter</code> pour distinguer entre les deux cas.</p>\n<p>Vous pouvez aussi importer ce signal à partir de <code class=\"docutils literal notranslate\">django.core.signals</code> pour éviter de l’importer à partir de <code class=\"docutils literal notranslate\">django.test</code> dans un contexte ne concernant pas les tests.</p>\n<aside class=\"version-note version-changed\" data-version=\"1.8\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 1.8</p><p>Le signal a été déplacé vers <code class=\"docutils literal notranslate\">django.core.signals</code>, comme expliqué ci-dessus.</p>\n</aside>\n<p>Paramètres envoyés avec ce signal :</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\">sender</code></dt><dd><p>Le gestionnaire des réglages.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">setting</code></dt><dd><p>Le nom du réglage.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">valeur</code></dt><dd><p>La valeur du réglage après la modification. Pour les réglages qui n’existent initialement pas, durant la phase de « teardown », <code class=\"docutils literal notranslate\">value</code> vaut <code class=\"docutils literal notranslate\">None</code>.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">enter</code></dt><dd><p>Une valeur booléenne ; <code class=\"docutils literal notranslate\">True</code> si le réglage doit être appliqué, <code class=\"docutils literal notranslate\">False</code> s’il doit être restauré.</p>\n</dd>\n</dl>\n</section>\n<section id=\"template-rendered\">\n<h3><code class=\"docutils literal notranslate\">template_rendered</code><a class=\"heading-anchor\" href=\"#template-rendered\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.test.signals.template_rendered\">\n<span class=\"sig-prename descclassname\">django.test.signals.</span><span class=\"sig-name descname\">template_rendered</span><a class=\"heading-anchor\" href=\"#django.test.signals.template_rendered\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Envoyé lorsque le système de test produit un gabarit. Ce signal n’est pas émis pendant les opérations normales d’un serveur Django, il n’est disponible que durant les tests.</p>\n<p>Paramètres envoyés avec ce signal :</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\">sender</code></dt><dd><p>L’objet <a class=\"reference internal\" href=\"/fr/1.9/ref/templates/api/#django.template.Template\" title=\"django.template.Template\"><code class=\"xref py py-class docutils literal notranslate\">Template</code></a> qui a été produit.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">template</code></dt><dd><p>Identique à <code class=\"docutils literal notranslate\">sender</code></p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">context</code></dt><dd><p>L’objet <a class=\"reference internal\" href=\"/fr/1.9/ref/templates/api/#django.template.Context\" title=\"django.template.Context\"><code class=\"xref py py-class docutils literal notranslate\">Context</code></a> avec lequel le gabarit a été produit.</p>\n</dd>\n</dl>\n</section>\n</section>\n<section id=\"module-django.db.backends\">\n<span id=\"database-wrappers\"></span><h2>Adaptateurs de base de données<a class=\"heading-anchor\" href=\"#module-django.db.backends\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Signaux envoyés par l’adaptateur de base de données lorsqu’une connexion à la base de données est initiée.</p>\n<section id=\"connection-created\">\n<h3><code class=\"docutils literal notranslate\">connection_created</code><a class=\"heading-anchor\" href=\"#connection-created\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.signals.connection_created\">\n<span class=\"sig-prename descclassname\">django.db.backends.signals.</span><span class=\"sig-name descname\">connection_created</span><a class=\"heading-anchor\" href=\"#django.db.backends.signals.connection_created\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Envoyé lorsque l’adaptateur de base de données crée la connexion initiale à la base de données. C’est particulièrement utile si vous avez besoin d’envoyer des commandes post connexion au moteur SQL.</p>\n<p>Paramètres envoyés avec ce signal :</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\">sender</code></dt><dd><p>La classe d’adaptation de la base de données – c’est-à-dire <code class=\"docutils literal notranslate\">django.db.backends.postgresql.DatabaseWrapper</code> ou <code class=\"docutils literal notranslate\">django.db.backends.mysql.DatabaseWrapper</code>, etc.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">connection</code></dt><dd><p>La connexion de base de données qui a été ouverte. Cela peut être utilisé dans une configuration à plusieurs bases de données pour différencier les signaux de connexion de différentes bases de données.</p>\n</dd>\n</dl>\n</section>\n</section>","rootId":"signals","toc":[{"title":"Signaux de modèle","anchor":"module-django.db.models.signals","children":[{"title":"pre_init","anchor":"pre-init","children":[]},{"title":"post_init","anchor":"post-init","children":[]},{"title":"pre_save","anchor":"pre-save","children":[]},{"title":"post_save","anchor":"post-save","children":[]},{"title":"pre_delete","anchor":"pre-delete","children":[]},{"title":"post_delete","anchor":"post-delete","children":[]},{"title":"m2m_changed","anchor":"m2m-changed","children":[]},{"title":"class_prepared","anchor":"class-prepared","children":[]}]},{"title":"Signaux de gestion","anchor":"management-signals","children":[{"title":"pre_migrate","anchor":"pre-migrate","children":[]},{"title":"post_migrate","anchor":"post-migrate","children":[]}]},{"title":"Signaux de requête et de réponse","anchor":"module-django.core.signals","children":[{"title":"request_started","anchor":"request-started","children":[]},{"title":"request_finished","anchor":"request-finished","children":[]},{"title":"got_request_exception","anchor":"got-request-exception","children":[]}]},{"title":"Signaux de test","anchor":"module-django.test.signals","children":[{"title":"setting_changed","anchor":"setting-changed","children":[]},{"title":"template_rendered","anchor":"template-rendered","children":[]}]},{"title":"Adaptateurs de base de données","anchor":"module-django.db.backends","children":[{"title":"connection_created","anchor":"connection-created","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/1.9/ref/"}],"prev":{"docname":"ref/settings","title":"Réglages","url":"/fr/1.9/ref/settings/"},"next":{"docname":"ref/templates/index","title":"Gabarits","url":"/fr/1.9/ref/templates/"},"formats":{"html":"/fr/1.9/ref/signals/","markdown":"/fr/1.9/ref/signals.md","json":"/fr/1.9/ref/signals.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/ref/signals.txt","official":"https://docs.djangoproject.com/fr/1.9/ref/signals/","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","fr","ja","id","pt-br","es"]}