{"title":"Applications","version":"5.2","locale":"fr","docname":"ref/applications","url":"/fr/5.2/ref/applications/","canonical":"https://djangodocs.dev/fr/5.2/ref/applications/","summary":"Django contient un registre des applications installées qui stocke la configuration et fournit l’introspection. Il maintient également une liste des modèles…","html":"<span id=\"applications\"></span><h1>Applications<a class=\"heading-anchor\" href=\"#module-django.apps\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django contient un registre des applications installées qui stocke la configuration et fournit l’introspection. Il maintient également une liste des <a class=\"reference internal\" href=\"/fr/5.2/topics/db/models/\"><span class=\"doc\">modèles</span></a> disponibles.</p>\n<p>Ce registre est appelé <a class=\"reference internal\" href=\"#django.apps.apps\" title=\"django.apps.apps\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">apps</span></code></a> et est disponible dans <a class=\"reference internal\" href=\"#module-django.apps\" title=\"django.apps\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.apps</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.apps</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">apps</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">apps</span><span class=\"o\">.</span><span class=\"n\">get_app_config</span><span class=\"p\">(</span><span class=\"s2\">&quot;admin&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">verbose_name</span>\n<span class=\"go\">&#39;Administration&#39;</span>\n</code></pre></div>\n<section id=\"projects-and-applications\">\n<h2>Projets et applications<a class=\"heading-anchor\" href=\"#projects-and-applications\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Le terme <strong>projet</strong> décrit une application web Django. Le paquet Python du projet est définit principalement par un module de réglages <code class=\"docutils literal notranslate\"><span class=\"pre\">settings</span></code>, mais il contient généralement d’autres choses. Par exemple, lorsque vous exécutez <code class=\"docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">startproject</span> <span class=\"pre\">monsite</span></code>, vous obtenez un répertoire de projet <code class=\"docutils literal notranslate\"><span class=\"pre\">monsite</span></code> contenant un paquet Python <code class=\"docutils literal notranslate\"><span class=\"pre\">monsite</span></code> avec les fichiers <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">urls.py</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">asgi.py</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">wsgi.py</span></code>. Le paquet de projet est souvent étendu par l’ajout de choses comme des instantanés, des fichiers CSS et des gabarits qui ne sont pas liés à une application particulière.</p>\n<p>Un <strong>répertoire racine de projet</strong> (celui qui contient <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span></code>) est généralement un conteneur pour toutes les applications d’un projet qui ne sont pas installées séparément.</p>\n<p>Le terme <strong>application</strong> décrit un paquet Python qui fournit un certain ensemble de fonctionnalités. Les applications <a class=\"reference internal\" href=\"/fr/5.2/intro/reusable-apps/\"><span class=\"doc\">peuvent être réutilisées</span></a> dans différents projets.</p>\n<p>Les applications comprennent une combinaison de modèles, vues, gabarits, balises de gabarits, fichiers statiques, URL, intergiciels, etc. Elles sont généralement liées à des projets via le réglage <a class=\"reference internal\" href=\"/fr/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> et éventuellement avec d’autres mécanismes tels que les configurations d’URL, le réglage <a class=\"reference internal\" href=\"/fr/5.2/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> ou l’héritage de gabarit.</p>\n<p>Il est important de comprendre qu’une application Django est un ensemble de code qui interagit avec les différentes parties du système. Il n’existe pas d’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Application</span></code> en tant que tel. Cependant, il y a quelques endroits où Django a besoin d’interagir avec les applications installées, principalement pour la configuration et aussi l’introspection. C’est pourquoi le registre des applications maintient des métadonnées dans une instance de <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a> pour chaque application installée.</p>\n<p>Il n’y a pas restriction au fait qu’un paquet de projet ne puisse pas aussi être considéré comme une application et qu’il contienne des modèles, etc. (ce qui demanderait de l’ajouter dans la liste <a class=\"reference internal\" href=\"/fr/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>).</p>\n</section>\n<section id=\"configuring-applications\">\n<span id=\"configuring-applications-ref\"></span><h2>Configuration des applications<a class=\"heading-anchor\" href=\"#configuring-applications\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pour configurer une application, créez un module <code class=\"docutils literal notranslate\"><span class=\"pre\">apps.py</span></code> dans l’application, puis définissez une sous-classe de <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a> dans ce fichier.</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> contient le chemin en syntaxe pointée vers le module d’une application, et que Django trouve exactement une sous-classe de <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a> dans le sous-module <code class=\"docutils literal notranslate\"><span class=\"pre\">apps.py</span></code>, il utilise par défaut cette configuration pour l’application. Ce comportement peut être désactivé en définissant <a class=\"reference internal\" href=\"#django.apps.AppConfig.default\" title=\"django.apps.AppConfig.default\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">AppConfig.default</span></code></a> à <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n<p>Si le module <code class=\"docutils literal notranslate\"><span class=\"pre\">apps.py</span></code> contient plus d’une sous-classe <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a>, Django en cherche une seule ayant l’attribut <a class=\"reference internal\" href=\"#django.apps.AppConfig.default\" title=\"django.apps.AppConfig.default\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">AppConfig.default</span></code></a> à <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n<p>Si aucune sous-classe de <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a> n’est trouvée, la classe <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a> de base est utilisée.</p>\n<p>Il est aussi possible de mettre dans <a class=\"reference internal\" href=\"/fr/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> le chemin à syntaxe pointée explicite vers une classe de configuration précise</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">INSTALLED_APPS</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"o\">...</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;polls.apps.PollsAppConfig&quot;</span><span class=\"p\">,</span>\n    <span class=\"o\">...</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<section id=\"for-application-authors\">\n<h3>Pour les auteurs d’applications<a class=\"heading-anchor\" href=\"#for-application-authors\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si vous créez une application réutilisable appelée « Rock “n” roll », voici comment vous pourriez définir un nom approprié pour l’interface d’administration :</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\"># rock_n_roll/apps.py</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.apps</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">AppConfig</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">RockNRollConfig</span><span class=\"p\">(</span><span class=\"n\">AppConfig</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;rock_n_roll&quot;</span>\n    <span class=\"n\">verbose_name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Rock ’n’ roll&quot;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">RockNRollConfig</span></code> sera chargée automatiquement si <a class=\"reference internal\" href=\"/fr/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> contient <code class=\"docutils literal notranslate\"><span class=\"pre\">'rock_n_roll'</span></code>. Si vous voulez empêcher cela, définissez <a class=\"reference internal\" href=\"#django.apps.AppConfig.default\" title=\"django.apps.AppConfig.default\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">default</span></code></a> à <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> dans la définition de la classe.</p>\n<p>Vous pouvez écrire plusieurs sous-classes <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a> avec différents comportements. Pour indiquer à Django la classe à utiliser par défaut, définissez l’attribut <a class=\"reference internal\" href=\"#django.apps.AppConfig.default\" title=\"django.apps.AppConfig.default\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">default</span></code></a> de la classe à <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>. Si un utilisateur de l’application souhaite choisir une configuration qui n’est pas celle par défaut, il doit remplacer <code class=\"docutils literal notranslate\"><span class=\"pre\">'rock_n_roll'</span></code> par le chemin à syntaxe pointée vers cette classe spécifique dans son réglage <a class=\"reference internal\" href=\"/fr/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>.</p>\n<p>L’attribut <a class=\"reference internal\" href=\"#django.apps.AppConfig.name\" title=\"django.apps.AppConfig.name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">AppConfig.name</span></code></a> indique à Django à quelle application cette configuration s’applique. Vous pouvez définir tout autre attribut documenté dans la référence de l’API de <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a>.</p>\n<p>Les sous-classes de <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a> peuvent être définies n’importe où. La convention <code class=\"docutils literal notranslate\"><span class=\"pre\">apps.py</span></code> ne sert qu’à indiquer à Django comment charger automatiquement la configuration lorsque <a class=\"reference internal\" href=\"/fr/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> contient le chemin vers le module principal d’une application plutôt que le chemin vers sa classe de configuration.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Si votre code importe le registre des applications dans le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__.py</span></code> d’une application, le nom <code class=\"docutils literal notranslate\"><span class=\"pre\">apps</span></code> entrera en conflit avec le sous-module <code class=\"docutils literal notranslate\"><span class=\"pre\">apps</span></code>. La meilleure approche consiste à déplacer ce code vers un sous-module et de l’importer. Une solution de contournement consiste à importer le registre sous un nom différent :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.apps</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">apps</span> <span class=\"k\">as</span> <span class=\"n\">django_apps</span>\n</code></pre></div>\n</aside>\n</section>\n<section id=\"for-application-users\">\n<h3>Pour les utilisateurs d’applications<a class=\"heading-anchor\" href=\"#for-application-users\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si vous utilisez « Rock “n” roll » dans un projet appelé <code class=\"docutils literal notranslate\"><span class=\"pre\">anthology</span></code>, mais que vous souhaitez plutôt qu’il apparaisse comme « Jazz Manouche », vous pouvez fournir votre propre configuration :</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\"># anthology/apps.py</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">rock_n_roll.apps</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">RockNRollConfig</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">JazzManoucheConfig</span><span class=\"p\">(</span><span class=\"n\">RockNRollConfig</span><span class=\"p\">):</span>\n    <span class=\"n\">verbose_name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Jazz Manouche&quot;</span>\n\n\n<span class=\"c1\"># anthology/settings.py</span>\n\n<span class=\"n\">INSTALLED_APPS</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;anthology.apps.JazzManoucheConfig&quot;</span><span class=\"p\">,</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Cet exemple montre des classes de configuration spécifiques au projet situées dans un sous-module appelé <code class=\"docutils literal notranslate\"><span class=\"pre\">apps.py</span></code>. Ceci est une convention, pas une obligation. Les sous-classes <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a> peuvent être définies n’importe où.</p>\n<p>Dans cette situation, <a class=\"reference internal\" href=\"/fr/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> doit contenir le chemin à syntaxe pointée vers la classe de configuration, car celle-ci se trouve en dehors d’une application et ne peut donc pas être automatiquement détectée.</p>\n</section>\n</section>\n<section id=\"application-configuration\">\n<h2>Configuration d’applications<a class=\"heading-anchor\" href=\"#application-configuration\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AppConfig</span></span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Les objets de configuration d’application stockent les métadonnées d’une application. Certains attributs peuvent être configurés dans des sous-classes de <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a>. D’autres sont définis par Django et sont en lecture seule.</p>\n</dd></dl>\n\n<section id=\"configurable-attributes\">\n<h3>Attributs configurables<a class=\"heading-anchor\" href=\"#configurable-attributes\"><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.apps.AppConfig.name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">AppConfig.</span></span><span class=\"sig-name descname\"><span class=\"pre\">name</span></span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.name\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Chemin Python complet vers l’application, par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.admin'</span></code>.</p>\n<p>Cet attribut détermine à quelle application la configuration s’applique. Il doit être défini dans toutes les sous-classes de <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a>.</p>\n<p>Il doit être unique dans le contexte d’un même projet Django.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig.label\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">AppConfig.</span></span><span class=\"sig-name descname\"><span class=\"pre\">label</span></span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.label\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Nom court de l’application, par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">'admin'</span></code></p>\n<p>Cet attribut permet de ré-étiqueter une application lorsque deux applications ont des étiquettes incompatibles. Par défaut, <code class=\"docutils literal notranslate\"><span class=\"pre\">label</span></code> est le dernier élément de <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>. Il doit être un identifiant Python valide.</p>\n<p>Il doit être unique dans le contexte d’un même projet Django.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>La modification de cet attribut après que les migrations d’une application ont été appliquées aboutira à des changements nocifs au projet ou, dans le cas d’une application réutilisable, à toute installation de cette application. Ceci parce que <code class=\"docutils literal notranslate\"><span class=\"pre\">AppConfig.label</span></code> est utilisée dans les tables de bases de données et les fichiers de migration lorsqu’on fait référence à une application dans la liste des dépendances.</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig.verbose_name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">AppConfig.</span></span><span class=\"sig-name descname\"><span class=\"pre\">verbose_name</span></span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.verbose_name\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Nom convivial de l’application, par ex. « Administration ».</p>\n<p>Par défaut, cet attribut est équivalent à <code class=\"docutils literal notranslate\"><span class=\"pre\">label.title()</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig.path\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">AppConfig.</span></span><span class=\"sig-name descname\"><span class=\"pre\">path</span></span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.path\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Chemin du système de fichiers vers le répertoire de l’application, par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">'/usr/lib/pythonX.Y/dist-packages/django/contrib/admin'</span></code>.</p>\n<p>Dans la plupart des cas, Django peut automatiquement détecter et définir cet attribut, mais vous pouvez également fournir une dérogation explicite comme attribut de classe sur la sous-classe de <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a>. Dans certains cas, c’est une nécessité ; par exemple, si le paquet de l’application est un <a class=\"reference internal\" href=\"#namespace-package\">paquet avec espace de noms</a> comprenant plusieurs chemins.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig.default\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">AppConfig.</span></span><span class=\"sig-name descname\"><span class=\"pre\">default</span></span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.default\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Définissez cet attribut à <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> pour empêcher Django de choisir automatiquement une classe de configuration. C’est utile lorsque <code class=\"docutils literal notranslate\"><span class=\"pre\">apps.py</span></code> définit une seule sous-classe <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a> mais que vous ne souhaitez pas que celle-ci soit choisie par défaut.</p>\n<p>Définissez cet attribut à <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> pour indiquer à Django de choisir automatiquement une classe de configuration. C’est utile lorsque <code class=\"docutils literal notranslate\"><span class=\"pre\">apps.py</span></code> définit plus d’une sous-classe <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a> et que vous souhaitez que Django en utilise une par défaut.</p>\n<p>Par défaut, cet attribut n’est pas défini.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig.default_auto_field\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">AppConfig.</span></span><span class=\"sig-name descname\"><span class=\"pre\">default_auto_field</span></span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.default_auto_field\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le type implicite de clé primaire à ajouter aux modèles de cette application. Vous pouvez utiliser cet attribut pour conserver <a class=\"reference internal\" href=\"/fr/5.2/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AutoField</span></code></a> comme type de clé primaire pour des applications réutilisables.</p>\n<p>Par défaut, il s’agit de la valeur du réglage <a class=\"reference internal\" href=\"/fr/5.2/ref/settings/#std-setting-DEFAULT_AUTO_FIELD\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEFAULT_AUTO_FIELD</span></code></a>.</p>\n</dd></dl>\n\n</section>\n<section id=\"read-only-attributes\">\n<h3>Attributs en lecture seule<a class=\"heading-anchor\" href=\"#read-only-attributes\"><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.apps.AppConfig.module\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">AppConfig.</span></span><span class=\"sig-name descname\"><span class=\"pre\">module</span></span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.module\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Module racine de l’application, par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;module</span> <span class=\"pre\">'django.contrib.admin'</span> <span class=\"pre\">from</span> <span class=\"pre\">'django/contrib/admin/__init__.py'&gt;</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig.models_module\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">AppConfig.</span></span><span class=\"sig-name descname\"><span class=\"pre\">models_module</span></span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.models_module\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Module contenant les modèles, par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;module</span> <span class=\"pre\">'django.contrib.admin.models'</span> <span class=\"pre\">from</span> <span class=\"pre\">'django/contrib/admin/models.py'&gt;</span></code>.</p>\n<p>Il peut valoir <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> si l’application ne contient pas de module <code class=\"docutils literal notranslate\"><span class=\"pre\">models</span></code>. Notez que les signaux relatifs à la base de données tels que <a class=\"reference internal\" href=\"/fr/5.2/ref/signals/#django.db.models.signals.pre_migrate\" title=\"django.db.models.signals.pre_migrate\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">pre_migrate</span></code></a> et <a class=\"reference internal\" href=\"/fr/5.2/ref/signals/#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_migrate</span></code></a> ne sont émis que pour les applications qui ont un module <code class=\"docutils literal notranslate\"><span class=\"pre\">models</span></code>.</p>\n</dd></dl>\n\n</section>\n<section id=\"methods\">\n<h3>Méthodes<a class=\"heading-anchor\" href=\"#methods\"><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.apps.AppConfig.get_models\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">AppConfig.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_models</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">include_auto_created</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">include_swapped</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.get_models\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie un objet itérable de classes <a class=\"reference internal\" href=\"/fr/5.2/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Model</span></code></a> pour cette application.</p>\n<p>Nécessite que le registre des applications soit complètement défini.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig.get_model\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">AppConfig.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_model</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">require_ready</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.get_model\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie la classe <a class=\"reference internal\" href=\"/fr/5.2/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Model</span></code></a> ayant le nom <code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code> donné. <code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code> est insensible à la casse.</p>\n<p>Génère <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#LookupError\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">LookupError</span></code></a> si aucun modèle de ce nom n’existe dans cette application.</p>\n<p>Nécessite que le registre des applications soit complètement défini, sauf dans le cas où le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">require_ready</span></code> est <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>. <code class=\"docutils literal notranslate\"><span class=\"pre\">require_ready</span></code> a le même comportement que pour <a class=\"reference internal\" href=\"#django.apps.apps.get_model\" title=\"django.apps.apps.get_model\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">apps.get_model()</span></code></a>.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig.ready\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">AppConfig.</span></span><span class=\"sig-name descname\"><span class=\"pre\">ready</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.ready\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Les sous-classes peuvent étendre cette méthode pour effectuer des tâches d’initialisation telles que l’enregistrement de signaux. Elle est appelée dès que le registre est entièrement peuplé.</p>\n<p>Même s’il n’est pas possible d’importer des modèles au niveau des modules où les classes <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a> sont définies, il est possible de les importer dans <code class=\"docutils literal notranslate\"><span class=\"pre\">ready()</span></code>, en utilisant soit une instruction <code class=\"docutils literal notranslate\"><span class=\"pre\">import</span></code> ou <a class=\"reference internal\" href=\"#django.apps.AppConfig.get_model\" title=\"django.apps.AppConfig.get_model\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_model()</span></code></a>.</p>\n<p>Si vous inscrivez des <a class=\"reference internal\" href=\"/fr/5.2/ref/signals/#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\"><span class=\"pre\">signaux</span> <span class=\"pre\">de</span> <span class=\"pre\">modèle</span></code></a>, vous pouvez faire référence à l’expéditeur par son étiquette textuelle au lieu d’utiliser la classe de modèle en elle-même.</p>\n<p>Exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.apps</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">AppConfig</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.signals</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">pre_save</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">RockNRollConfig</span><span class=\"p\">(</span><span class=\"n\">AppConfig</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">ready</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># importing model classes</span>\n        <span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">MyModel</span>  <span class=\"c1\"># or...</span>\n\n        <span class=\"n\">MyModel</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_model</span><span class=\"p\">(</span><span class=\"s2\">&quot;MyModel&quot;</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># registering signals with the model&#39;s string label</span>\n        <span class=\"n\">pre_save</span><span class=\"o\">.</span><span class=\"n\">connect</span><span class=\"p\">(</span><span class=\"n\">receiver</span><span class=\"p\">,</span> <span class=\"n\">sender</span><span class=\"o\">=</span><span class=\"s2\">&quot;app_label.MyModel&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Bien que vous puissiez accéder aux classes de modèles comme expliqué ci-dessus, évitez d’interagir avec la base de données dans l’implémentation de <a class=\"reference internal\" href=\"#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ready()</span></code></a>. Ceci inclut les méthodes de modèles qui exécutent des requêtes (<a class=\"reference internal\" href=\"/fr/5.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a>, <a class=\"reference internal\" href=\"/fr/5.2/ref/models/instances/#django.db.models.Model.delete\" title=\"django.db.models.Model.delete\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">delete()</span></code></a>, les méthodes de gestionnaires de modèles, etc.), ainsi que les requêtes SQL brutes via <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.connection</span></code>. La méthode <a class=\"reference internal\" href=\"#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ready()</span></code></a> s’exécute lors du démarrage de chaque commande de gestion. Par exemple, bien que la configuration de la base de données de test soit séparée des réglages de production, <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">test</span></code> pourrait malgré tout exécuter des requêtes sur votre base de données de <strong>production</strong> !</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Dans le processus d’initialisation normal, la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">ready</span></code> est appelée une seule fois par Django. Mais dans certains cas limites, en particulier dans les tests qui manipulent les applications installées, <code class=\"docutils literal notranslate\"><span class=\"pre\">ready</span></code> pourrait être appelée plus d’une fois. Dans ce cas, soit écrivez des méthodes idempotentes, soit placez un drapeau sur vos classes <code class=\"docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code> pour empêcher de ré-exécuter le code qui ne devrait être exécuté qu’une seule fois.</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"namespace-packages-as-apps\">\n<span id=\"namespace-package\"></span><h3>Paquets avec espace de noms en tant qu’applications<a class=\"heading-anchor\" href=\"#namespace-packages-as-apps\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les paquets Python sans la présence d’un fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">__init</span> <span class=\"pre\">__.py</span></code> sont appelés « paquets avec espace de noms » (namespace packages) et peuvent être dispersés dans plusieurs répertoires et à différents endroits de <code class=\"docutils literal notranslate\"><span class=\"pre\">sys.path</span></code> (voir <span class=\"target\" id=\"index-2\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0420/\"><strong>PEP 420</strong></a>).</p>\n<p>Les applications Django nécessitent un chemin de base unique du système de fichiers où Django (selon la configuration) recherche les gabarits, les fichiers statiques, etc. Ainsi, les paquets avec espace de noms ne peuvent être des applications Django que si l’une des conditions suivantes est vraie :</p>\n<ol class=\"arabic simple\">\n<li><p>Le paquet avec espace de noms n’a en fait qu’un seul emplacement (c’est-à-dire qu’il n’est pas dispersé sur plus d’un répertoire).</p></li>\n<li><p>La classe <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a> utilisée pour configurer l’application possède un attribut de classe <a class=\"reference internal\" href=\"#django.apps.AppConfig.path\" title=\"django.apps.AppConfig.path\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">path</span></code></a> qui correspond au chemin de répertoire absolu que Django utilise comme chemin de base unique pour l’application.</p></li>\n</ol>\n<p>Si aucune de ces conditions n’est remplie, Django génère une exception <a class=\"reference internal\" href=\"/fr/5.2/ref/exceptions/#django.core.exceptions.ImproperlyConfigured\" title=\"django.core.exceptions.ImproperlyConfigured\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ImproperlyConfigured</span></code></a>.</p>\n</section>\n</section>\n<section id=\"application-registry\">\n<h2>Registre d’applications<a class=\"heading-anchor\" href=\"#application-registry\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.apps.apps\">\n<span class=\"sig-name descname\"><span class=\"pre\">apps</span></span><a class=\"heading-anchor\" href=\"#django.apps.apps\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le registre d’applications fournit l’API publique suivante. Les méthodes qui ne sont pas énumérées ci-dessous sont considérées comme privées et peuvent changer sans préavis.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.apps.apps.ready\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">apps.</span></span><span class=\"sig-name descname\"><span class=\"pre\">ready</span></span><a class=\"heading-anchor\" href=\"#django.apps.apps.ready\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Attribut booléen défini à <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> après que le registre a été entièrement peuplé et que toutes les méthodes <a class=\"reference internal\" href=\"#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">AppConfig.ready()</span></code></a> ont été appelées.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.apps.apps.get_app_configs\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">apps.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_app_configs</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.apps.apps.get_app_configs\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie un objet itérable d’instances de <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a>.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.apps.apps.get_app_config\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">apps.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_app_config</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">app_label</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.apps.apps.get_app_config\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie une instance <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppConfig</span></code></a> de l’application correspondant à <code class=\"docutils literal notranslate\"><span class=\"pre\">app_label</span></code>. Génère <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#LookupError\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">LookupError</span></code></a> si une telle application n’existe pas.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.apps.apps.is_installed\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">apps.</span></span><span class=\"sig-name descname\"><span class=\"pre\">is_installed</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">app_name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.apps.apps.is_installed\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Vérifie si une application avec le nom donné existe dans le registre. <code class=\"docutils literal notranslate\"><span class=\"pre\">app_name</span></code> est le nom complet de l’application, par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.admin'</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.apps.apps.get_model\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">apps.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_model</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">app_label</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">require_ready</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.apps.apps.get_model\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie la classe <a class=\"reference internal\" href=\"/fr/5.2/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Model</span></code></a> correspondant aux paramètres <code class=\"docutils literal notranslate\"><span class=\"pre\">app_label</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code>. Cette méthode accepte aussi en raccourci un paramètre unique sous la forme <code class=\"docutils literal notranslate\"><span class=\"pre\">app_label.model_name</span></code>. <code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code> est insensible à la casse.</p>\n<p>Génère <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#LookupError\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">LookupError</span></code></a> si aucune application ou modèle correspondant n’existe. Génère <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#ValueError\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValueError</span></code></a> lorsque un paramètre unique est fourni sans contenir exactement un seul point.</p>\n<p>Nécessite que le registre des applications soit complètement défini, sauf dans le cas où le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">require_ready</span></code> est <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n<p>La définition de <code class=\"docutils literal notranslate\"><span class=\"pre\">require_ready</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> permet de consulter des modèles <a class=\"reference internal\" href=\"#app-loading-process\"><span class=\"std std-ref\">pendant que le registre des applications est en cours de remplissage</span></a>, particulièrement dans la seconde phase où les modèles sont importés. <code class=\"docutils literal notranslate\"><span class=\"pre\">get_model()</span></code> a donc le même effet que l’importation du modèle. Le principal cas d’utilisation concerne la configuration de classes de modèles en fonction de réglages, tels que <a class=\"reference internal\" href=\"/fr/5.2/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTH_USER_MODEL</span></code></a>.</p>\n<p>Lorsque <code class=\"docutils literal notranslate\"><span class=\"pre\">require_ready</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">get_model()</span></code> renvoie une classe de modèle qui peut ne pas être complètement fonctionnelle (par exemple, l’accès aux relations inversées peut être manquant) en attendant que le registre des applications soit complètement rempli. Pour cette raison, il est préférable de laisser <code class=\"docutils literal notranslate\"><span class=\"pre\">require_ready</span></code> à sa valeur par défaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> autant que possible.</p>\n</dd></dl>\n\n</section>\n<section id=\"initialization-process\">\n<span id=\"app-loading-process\"></span><h2>Processus d’initialisation<a class=\"heading-anchor\" href=\"#initialization-process\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"how-applications-are-loaded\">\n<h3>Chargement des applications<a class=\"heading-anchor\" href=\"#how-applications-are-loaded\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Lorsque Django démarre, <a class=\"reference internal\" href=\"#django.setup\" title=\"django.setup\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.setup()</span></code></a> est responsable de peupler le registre des applications.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.setup\">\n<span class=\"sig-name descname\"><span class=\"pre\">setup</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">set_prefix</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.setup\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Configure Django en :</p>\n<ul class=\"simple\">\n<li><p>chargeant les réglages ;</p></li>\n<li><p>configurant la journalisation ;</p></li>\n<li><p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">set_prefix</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, définissant le préfixe de script de résolution d’URL à <a class=\"reference internal\" href=\"/fr/5.2/ref/settings/#std-setting-FORCE_SCRIPT_NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FORCE_SCRIPT_NAME</span></code></a> s’il est défini ou sinon à <code class=\"docutils literal notranslate\"><span class=\"pre\">/</span></code>.</p></li>\n<li><p>initialisant le registre d’applications.</p></li>\n</ul>\n<p>Cette fonction est appelée automatiquement :</p>\n<ul class=\"simple\">\n<li><p>lors de l’exécution d’un serveur HTTP via le support ASGI ou WSGI de Django ;</p></li>\n<li><p>lors de l’appel d’une commande de gestion.</p></li>\n</ul>\n<p>Elle doit être appelée explicitement dans d’autres cas, comme par exemple dans les scripts Python ordinaires.</p>\n</dd></dl>\n\n<p>Le registre d’applications est initialisé en trois étapes. À chaque étape, Django traite toutes les applications dans l’ordre de <a class=\"reference internal\" href=\"/fr/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>.</p>\n<ol class=\"arabic\">\n<li><p>Tout d’abord, Django importe chaque élément de <a class=\"reference internal\" href=\"/fr/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>.</p>\n<p>S’il s’agit d’une classe de configuration de l’application, Django importe le paquet racine de l’application, défini par son attribut <a class=\"reference internal\" href=\"#django.apps.AppConfig.name\" title=\"django.apps.AppConfig.name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">name</span></code></a>. S’il s’agit d’un paquet Python, Django recherche une configuration d’application dans un sous-module <code class=\"docutils literal notranslate\"><span class=\"pre\">apps.py</span></code>, ou sinon crée une configuration d’application par défaut.</p>\n<p><em>À ce stade, votre code ne devrait pas importer de modèles !</em></p>\n<p>En d’autres termes, les paquets racines de vos applications et les modules qui définissent vos classes de configuration d’application ne devraient pas importer de modèles, même indirectement.</p>\n<p>Strictement parlant, Django permet d’importer des modèles une fois que leur configuration d’application est chargée. Toutefois, afin d’éviter toute contrainte inutile sur l’ordre dans <a class=\"reference internal\" href=\"/fr/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>, il est fortement recommandé de ne pas importer de modèles à ce stade.</p>\n<p>Une fois cette étape terminée, les API qui exploitent les configurations d’application telles que <a class=\"reference internal\" href=\"#django.apps.apps.get_app_config\" title=\"django.apps.apps.get_app_config\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_app_config()</span></code></a> deviennent utilisables.</p>\n</li>\n<li><p>Puis Django tente d’importer le sous-module <code class=\"docutils literal notranslate\"><span class=\"pre\">models</span></code> de chaque application, s’il en existe un.</p>\n<p>Vous devez définir ou importer tous les modèles dans les fichiers <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">models/__init__.py</span></code> de votre application. Autrement, le registre des applications pouvant ne pas être entièrement peuplé à ce point, cela pourrait provoquer un dysfonctionnement de l’ORM.</p>\n<p>Une fois cette étape terminée, les API qui agissent sur des modèles telles que <a class=\"reference internal\" href=\"#django.apps.apps.get_model\" title=\"django.apps.apps.get_model\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_model()</span></code></a> deviennent utilisables.</p>\n</li>\n<li><p>Enfin, Django exécute la méthode <a class=\"reference internal\" href=\"#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ready()</span></code></a> de chaque configuration d’application.</p></li>\n</ol>\n</section>\n<section id=\"troubleshooting\">\n<span id=\"applications-troubleshooting\"></span><h3>Dépannage<a class=\"heading-anchor\" href=\"#troubleshooting\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Voici quelques problèmes courants que vous pouvez rencontrer lors de l’initialisation :</p>\n<ul>\n<li><p><a class=\"reference internal\" href=\"/fr/5.2/ref/exceptions/#django.core.exceptions.AppRegistryNotReady\" title=\"django.core.exceptions.AppRegistryNotReady\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AppRegistryNotReady</span></code></a>: cela se produit lorsque l’importation d’une configuration d’application ou d’un module de modèles exécute du code qui dépend du registre d’applications.</p>\n<p>Par exemple, <a class=\"reference internal\" href=\"/fr/5.2/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext()</span></code></a> utilise le registre d’applications pour rechercher des catalogues de traduction dans les applications. Pour traduire au moment de l’importation, vous devez utiliser <a class=\"reference internal\" href=\"/fr/5.2/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext_lazy()</span></code></a> à la place (l’utilisation de <a class=\"reference internal\" href=\"/fr/5.2/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext()</span></code></a> serait une erreur, parce que la traduction s’effectuerait au moment de l’importation plutôt qu’à chaque requête en fonction de la langue active).</p>\n<p>L’exécution de requêtes en base de données avec l’ORM au moment de l’importation dans les modules de modèles déclenche également cette exception. L’ORM ne peut pas fonctionner correctement avant que tous les modèles ne soient disponibles.</p>\n<p>Cette exception se produit également si vous oubliez d’appeler <a class=\"reference internal\" href=\"#django.setup\" title=\"django.setup\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.setup()</span></code></a> dans un script Python autonome.</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ImportError:</span> <span class=\"pre\">cannot</span> <span class=\"pre\">import</span> <span class=\"pre\">name</span> <span class=\"pre\">...</span></code> Cela se produit si la séquence d’importation se trouve être une boucle.</p>\n<p>Pour éliminer de tels problèmes, vous devez réduire les dépendances entre vos modules de modèles et réaliser le moins de travail possible au moment de l’importation. Pour éviter d’exécuter du code au moment de l’importation, vous pouvez le déplacer dans une fonction et mettre en cache ses résultats. Le code sera exécuté la première fois que vous aurez besoin de ses résultats. Ce concept est connu sous le nom d”« évaluation différée ».</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.admin</span></code> effectue automatiquement la découverte des modules <code class=\"docutils literal notranslate\"><span class=\"pre\">admin</span></code> dans les applications installées. Pour l’en empêcher, modifiez le réglage <a class=\"reference internal\" href=\"/fr/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> pour qu’il contienne <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.admin.apps.SimpleAdminConfig'</span></code> au lieu de <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.admin'</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">RuntimeWarning:</span> <span class=\"pre\">Accessing</span> <span class=\"pre\">the</span> <span class=\"pre\">database</span> <span class=\"pre\">during</span> <span class=\"pre\">app</span> <span class=\"pre\">initialization</span> <span class=\"pre\">is</span> <span class=\"pre\">discouraged.</span></code> Cet avertissement est généré par des requêtes de base de données exécutées avant que les applications ne soient prêtes, comme par exemple durant l’importation des modules ou dans la méthode <a class=\"reference internal\" href=\"#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">AppConfig.ready()</span></code></a>. De telles requêtes de base de données prématurées sont découragées car elles vont s’exécuter durant le démarrage de chaque commande d’administration, ce qui va ralentir le démarrage du projet, mettre potentiellement en cache des données obsolètes et elles peuvent même échouer si des migrations sont pendantes.</p>\n<p>Typiquement, une erreur courante est d’interroger la base de données pour remplir des choix de champ de formulaire :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">LocationForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"n\">country</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">ChoiceField</span><span class=\"p\">(</span><span class=\"n\">choices</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"n\">c</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"k\">for</span> <span class=\"n\">c</span> <span class=\"ow\">in</span> <span class=\"n\">Country</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()])</span>\n</code></pre></div>\n<p>Dans l’exemple ci-dessus, la requête sous-jacente de <code class=\"docutils literal notranslate\"><span class=\"pre\">Country.objects.all()</span></code> est exécutée durant l’importation du module, car il y a itération de l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>. Pour éviter l’avertissement, le formulaire pourrait utiliser <a class=\"reference internal\" href=\"/fr/5.2/ref/forms/fields/#django.forms.ModelChoiceField\" title=\"django.forms.ModelChoiceField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelChoiceField</span></code></a> à la place :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">LocationForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"n\">country</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">ModelChoiceField</span><span class=\"p\">(</span><span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Country</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">())</span>\n</code></pre></div>\n<p>Pour faciliter le repérage du code qui a généré l’avertissement, vous pouvez demander à Python de <a class=\"reference external\" href=\"https://docs.python.org/3/library/warnings.html#warning-filter\" title=\"(disponible dans Python v3.14)\"><span class=\"xref std std-ref\">traiter les avertissements comme des erreurs</span></a> pour révéler la trace d’erreur, par exemple avec <code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">-Werror</span> <span class=\"pre\">manage.py</span> <span class=\"pre\">shell</span></code>.</p>\n</li>\n</ul>\n</section>\n</section>","rootId":"module-django.apps","toc":[{"title":"Projets et applications","anchor":"projects-and-applications","children":[]},{"title":"Configuration des applications","anchor":"configuring-applications","children":[{"title":"Pour les auteurs d’applications","anchor":"for-application-authors","children":[]},{"title":"Pour les utilisateurs d’applications","anchor":"for-application-users","children":[]}]},{"title":"Configuration d’applications","anchor":"application-configuration","children":[{"title":"Attributs configurables","anchor":"configurable-attributes","children":[]},{"title":"Attributs en lecture seule","anchor":"read-only-attributes","children":[]},{"title":"Méthodes","anchor":"methods","children":[]},{"title":"Paquets avec espace de noms en tant qu’applications","anchor":"namespace-packages-as-apps","children":[]}]},{"title":"Registre d’applications","anchor":"application-registry","children":[]},{"title":"Processus d’initialisation","anchor":"initialization-process","children":[{"title":"Chargement des applications","anchor":"how-applications-are-loaded","children":[]},{"title":"Dépannage","anchor":"troubleshooting","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/5.2/ref/"}],"prev":{"docname":"ref/index","title":"Référence de l’API","url":"/fr/5.2/ref/"},"next":{"docname":"ref/checks","title":"Infrastructure de contrôle système","url":"/fr/5.2/ref/checks/"},"formats":{"html":"/fr/5.2/ref/applications/","markdown":"/fr/5.2/ref/applications.md","json":"/fr/5.2/ref/applications.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/ref/applications.txt","official":"https://docs.djangoproject.com/fr/5.2/ref/applications/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}