{"title":"Écriture de votre première application Django, 1ère partie","version":"2.2","locale":"fr","docname":"intro/tutorial01","url":"/fr/2.2/intro/tutorial01/","canonical":"https://djangodocs.dev/fr/2.2/intro/tutorial01/","summary":"Apprenons avec un exemple. Tout au long de ce tutoriel, nous vous guiderons dans la création d’une application simple de sondage. Cela consistera en deux parties :…","html":"<h1>Écriture de votre première application Django, 1ère partie<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-1\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Apprenons avec un exemple.</p>\n<p>Tout au long de ce tutoriel, nous vous guiderons dans la création d’une application simple de sondage.</p>\n<p>Cela consistera en deux parties :</p>\n<ul class=\"simple\">\n<li><p>Un site public qui permet à des gens de voir les sondages et d’y répondre.</p></li>\n<li><p>Un site d’administration qui permet d’ajouter, de modifier et de supprimer des sondages.</p></li>\n</ul>\n<p>Nous supposerons que <a class=\"reference internal\" href=\"/fr/2.2/intro/install/\"><span class=\"doc\">Django est déjà installé</span></a>. Vous pouvez savoir si Django est installé et sa version en exécutant la commande suivante dans un terminal (indiqué par le préfixe $) :</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>django<span class=\"w\"> </span>--version\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py -m django --version\n</code></pre></div></div></div>\n<p>Si Django est installé, vous devriez voir apparaître la version de l’installation. Dans le cas contraire, vous obtiendrez une erreur disant « No module named django » (aucun module nommé django).</p>\n<p>Ce didacticiel est écrit pour Django 2.2, sur une base Python 3.5 (ou plus récent). Si la version de Django ne correspond pas, référez-vous au didacticiel correspondant à votre version de Django en utilisant le sélecteur de version au bas de cette page, ou mettez à jour Django à la version la plus récente. Si vous utilisez une version plus ancienne de Python, consultez <a class=\"reference internal\" href=\"/fr/2.2/faq/install/#faq-python-version-support\"><span class=\"std std-ref\">Quelle version de Python puis-je utiliser avec Django ?</span></a> pour trouver la version de Django qui correspond.</p>\n<p>Consultez <a class=\"reference internal\" href=\"/fr/2.2/topics/install/\"><span class=\"doc\">Comment installer Django</span></a> pour tout conseil sur la manière de supprimer d’anciennes versions de Django pour en installer une nouvelle.</p>\n<aside class=\"admonition-where-to-get-help admonition\">\n<p class=\"admonition-title\">Où obtenir de l’aide :</p>\n<p>If you’re having trouble going through this tutorial, please post a message\nto <a class=\"reference internal\" href=\"/fr/2.2/internals/mailing-lists/#django-users-mailing-list\"><span class=\"std std-ref\">django-users</span></a> or drop by <a class=\"reference external\" href=\"irc://irc.libera.chat/django\">#django on irc.libera.chat</a> to chat with other Django users who might\nbe able to help.</p>\n</aside>\n<section id=\"creating-a-project\">\n<h2>Création d’un projet<a class=\"heading-anchor\" href=\"#creating-a-project\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Si c’est la première fois que vous utilisez Django, vous devrez vous occuper de quelques éléments de configuration initiaux. Plus précisément, vous devrez lancer la génération automatique de code qui mettra en place un <a class=\"reference internal\" href=\"/fr/2.2/glossary/#term-project\"><span class=\"xref std std-term\">projet</span></a> Django – un ensemble de réglages particuliers à une instance de Django, qui comprend la configuration de la base de données, des options spécifiques à Django et d’autres propres à l’application.</p>\n<p>Depuis un terminal en ligne de commande, déplacez-vous à l’aide de la commande <code class=\"docutils literal notranslate\"><span class=\"pre\">cd</span></code> dans un répertoire dans lequel vous souhaitez conserver votre code, puis lancez la commande suivante :</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-1-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code><span class=\"gp\">$ </span>django-admin<span class=\"w\"> </span>startproject<span class=\"w\"> </span>mysite\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-1-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> django-admin startproject mysite\n</code></pre></div></div></div>\n<p>Cela va créer un répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite</span></code> dans le répertoire courant. Si cela ne fonctionne pas, consultez <a class=\"reference internal\" href=\"/fr/2.2/faq/troubleshooting/#troubleshooting-django-admin\"><span class=\"std std-ref\">Problèmes d’exécution de django-admin</span></a>.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Vous devez éviter de nommer vos projets en utilisant des noms réservés de Python ou des noms de composants de Django. Cela signifie en particulier que vous devez éviter d’utiliser des noms comme <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> (qui entrerait en conflit avec Django lui-même) ou <code class=\"docutils literal notranslate\"><span class=\"pre\">test</span></code> (qui entrerait en conflit avec un composant intégré de Python).</p>\n</aside>\n<aside class=\"admonition-where-should-this-code-live admonition\">\n<p class=\"admonition-title\">À quel endroit ce code devrait-il se trouver ?</p>\n<p>Si vous avez une expérience en PHP, vous avez probablement l’habitude de placer votre code dans le répertoire racine de votre serveur Web (comme <code class=\"docutils literal notranslate\"><span class=\"pre\">/var/www/</span></code>). Avec Django, ne le faites pas. Ce n’est pas une bonne idée de mettre du code Python dans le répertoire racine de votre serveur Web, parce que cela crée le risque que l’on puisse voir votre code sur le Web, ce qui n’est pas bon pour la sécurité.</p>\n<p>Mettez votre code dans un répertoire en dehors de la racine de votre serveur Web, comme par exemple <code class=\"file docutils literal notranslate\"><span class=\"pre\">home/moncode</span></code>.</p>\n</aside>\n<p>Voyons ce que <a class=\"reference internal\" href=\"/fr/2.2/ref/django-admin/#django-admin-startproject\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">startproject</span></code></a> a créé :</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\">mysite</span><span class=\"o\">/</span>\n    <span class=\"n\">manage</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">mysite</span><span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">urls</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">wsgi</span><span class=\"o\">.</span><span class=\"n\">py</span>\n</code></pre></div>\n<p>Ces fichiers sont :</p>\n<ul class=\"simple\">\n<li><p>Le premier répertoire racine <code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/</span></code> n’est qu’un contenant pour votre projet. Son nom n’a pas d’importance pour Django ; vous pouvez le renommer comme vous voulez.</p></li>\n<li><p><code class=\"file docutils literal notranslate\"><span class=\"pre\">manage.py</span></code> : un utilitaire en ligne de commande qui vous permet d’interagir avec ce projet Django de différentes façons. Vous trouverez toutes les informations nécessaires sur <code class=\"file docutils literal notranslate\"><span class=\"pre\">manage.py</span></code> dans <a class=\"reference internal\" href=\"/fr/2.2/ref/django-admin/\"><span class=\"doc\">django-admin et manage.py</span></a>.</p></li>\n<li><p>Le sous-répertoire <code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/</span></code> correspond au paquet Python effectif de votre projet. C’est le nom du paquet Python que vous devrez utiliser pour importer ce qu’il contient (par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite.urls</span></code>).</p></li>\n<li><p><code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/__init__.py</span></code> : un fichier vide qui indique à Python que ce répertoire doit être considéré comme un paquet. Si vous êtes débutant en Python, lisez <a class=\"reference external\" href=\"https://docs.python.org/3/tutorial/modules.html#tut-packages\" title=\"(disponible dans Python v3.14)\"><span class=\"xref std std-ref\">les informations sur les paquets</span></a> (en) dans la documentation officielle de Python.</p></li>\n<li><p><code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code> : réglages et configuration de ce projet Django. <a class=\"reference internal\" href=\"/fr/2.2/topics/settings/\"><span class=\"doc\">Les réglages de Django</span></a> vous apprendra tout sur le fonctionnement des réglages.</p></li>\n<li><p><code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/urls.py</span></code> : les déclarations des URL de ce projet Django, une sorte de « table des matières » de votre site Django. Vous pouvez en lire plus sur les URL dans <a class=\"reference internal\" href=\"/fr/2.2/topics/http/urls/\"><span class=\"doc\">Distribution des URL</span></a>.</p></li>\n<li><p><code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/wsgi.py</span></code> : un point d’entrée pour les serveurs Web compatibles WSGI pour déployer votre projet. Voir <a class=\"reference internal\" href=\"/fr/2.2/howto/deployment/wsgi/\"><span class=\"doc\">Comment déployer avec WSGI</span></a> pour plus de détails.</p></li>\n</ul>\n</section>\n<section id=\"the-development-server\">\n<h2>Le serveur de développement<a class=\"heading-anchor\" href=\"#the-development-server\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Vérifions que votre projet Django fonctionne. Déplacez-vous dans le répertoire <code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite</span></code> si ce n’est pas déjà fait, et lancez les commandes suivantes :</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-2-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>runserver\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-2-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py runserver\n</code></pre></div></div></div>\n<p>Vous verrez les messages suivants défiler en ligne de commande :</p>\n<pre class=\"literal-block\">Performing system checks...\n\nSystem check identified no issues (0 silenced).\n\nYou have unapplied migrations; your app may not work properly until they are applied.\nRun 'python manage.py migrate' to apply them.\n\n09 août 2026 - 15:50:53\nDjango version 2.2, using settings 'mysite.settings'\nStarting development server at <a class=\"reference external\" href=\"http://127.0.0.1:8000/\">http://127.0.0.1:8000/</a>\nQuit the server with CONTROL-C.</pre>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Ignorez pour l’instant l’avertissement au sujet des migrations de base de données non appliquées ; nous nous occuperons de la base de données tantôt.</p>\n</aside>\n<p>Vous avez démarré le serveur de développement de Django, un serveur Web léger entièrement écrit en Python. Nous l’avons inclus avec Django de façon à vous permettre de développer rapidement, sans avoir à vous occuper de la configuration d’un serveur de production – comme Apache – tant que vous n’en avez pas besoin.</p>\n<p>C’est le moment de noter soigneusement ceci : <strong>n’utilisez jamais</strong> ce serveur pour quoi que ce soit qui s’approche d’un environnement de production. Il est fait seulement pour tester votre travail pendant le développement (notre métier est le développement d’environnements Web, pas de serveurs Web).</p>\n<p>Maintenant que le serveur tourne, allez à l’adresse <a class=\"reference external\" href=\"http://127.0.0.1:8000\">http://127.0.0.1:8000</a> avec votre navigateur Web. Vous verrez une page avec le message « Félicitations ! » ainsi qu’une fusée qui décolle. Ça marche !</p>\n<aside class=\"admonition-changing-the-port admonition\">\n<p class=\"admonition-title\">Modification du port</p>\n<p>Par défaut, la commande <a class=\"reference internal\" href=\"/fr/2.2/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">runserver</span></code></a> démarre le serveur de développement sur l’IP interne sur le port 8000.</p>\n<p>Si vous voulez changer cette valeur, passez-la comme paramètre sur la ligne de commande. Par exemple, cette commande démarre le serveur sur le port 8080 :</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-3-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>runserver<span class=\"w\"> </span><span class=\"m\">8080</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-3-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py runserver 8080\n</code></pre></div></div></div>\n<p>Si vous voulez changer l’IP du serveur, passez-la comme paramètre avec le port. Par exemple, pour écouter toutes les IP publiques disponibles (ce qui est utile si vous exécutez Vagrant ou que souhaitez montrer votre travail à des personnes sur d’autres ordinateurs de votre réseau), faites :</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-4-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>runserver<span class=\"w\"> </span><span class=\"m\">0</span>:8000\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-4-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py runserver 0:8000\n</code></pre></div></div></div>\n<p><strong>0</strong> est un raccourci pour <strong>0.0.0.0</strong>. La documentation complète du serveur de développement se trouve dans la référence de <a class=\"reference internal\" href=\"/fr/2.2/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">runserver</span></code></a>.</p>\n</aside>\n<aside class=\"admonition-automatic-reloading-of-djadmin-runserver admonition\">\n<p class=\"admonition-title\">Rechargement automatique de <a class=\"reference internal\" href=\"/fr/2.2/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">runserver</span></code></a></p>\n<p>Le serveur de développement recharge automatiquement le code Python lors de chaque requête si nécessaire. Vous ne devez pas redémarrer le serveur pour que les changements de code soient pris en compte. Cependant, certaines actions comme l’ajout de fichiers ne provoquent pas de redémarrage, il est donc nécessaire de redémarrer manuellement le serveur dans ces cas.</p>\n</aside>\n</section>\n<section id=\"creating-the-polls-app\">\n<h2>Création de l’application Polls<a class=\"heading-anchor\" href=\"#creating-the-polls-app\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Maintenant que votre environnement – un « projet » – est en place, vous êtes prêt à commencer à travailler.</p>\n<p>Chaque application que vous écrivez avec Django est en fait un paquet Python qui respecte certaines conventions. Django est livré avec un utilitaire qui génère automatiquement la structure des répertoires de base d’une application, ce qui vous permet de vous concentrer sur l’écriture du code, plutôt que sur la création de répertoires.</p>\n<aside class=\"admonition-projects-vs-apps admonition\">\n<p class=\"admonition-title\">Projets vs. applications</p>\n<p>Quelle est la différence entre un projet et une application ? Une application est une application Web qui fait quelque chose – par exemple un système de blog, une base de données publique ou une application de sondage. Un projet est un ensemble de réglages et d’applications pour un site Web particulier. Un projet peut contenir plusieurs applications. Une application peut apparaître dans plusieurs projets.</p>\n</aside>\n<p>Vos applications peuvent se trouver à n’importe quel endroit de votre <a class=\"reference external\" href=\"https://docs.python.org/3/tutorial/modules.html#tut-searchpath\" title=\"(disponible dans Python v3.14)\"><span class=\"xref std std-ref\">chemin de recherche Python</span></a>. Dans ce didacticiel, nous allons créer une application de sondage au même niveau que le fichier <code class=\"file docutils literal notranslate\"><span class=\"pre\">manage.py</span></code> pour qu’elle puisse être importée comme module de premier niveau plutôt que comme sous-module de <code class=\"docutils literal notranslate\"><span class=\"pre\">monsite</span></code>.</p>\n<p>Pour créer votre application, assurez-vous d’être dans le même répertoire que <code class=\"file docutils literal notranslate\"><span class=\"pre\">manage.py</span></code> et saisissez cette commande :</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-5-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>startapp<span class=\"w\"> </span>polls\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-5-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py startapp polls\n</code></pre></div></div></div>\n<p>Cela va créer un répertoire <code class=\"file docutils literal notranslate\"><span class=\"pre\">polls</span></code>, qui est structuré de la façon suivante :</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\">polls</span><span class=\"o\">/</span>\n    <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">apps</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">migrations</span><span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">tests</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">py</span>\n</code></pre></div>\n<p>Cette structure de répertoire accueillera l’application de sondage.</p>\n</section>\n<section id=\"write-your-first-view\">\n<h2>Écriture d’une première vue<a class=\"heading-anchor\" href=\"#write-your-first-view\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Écrivons la première vue. Ouvrez le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/views.py</span></code> et placez-y le code Python suivant :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/views.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">index</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;Hello, world. You&#39;re at the polls index.&quot;</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>C’est la vue Django la plus simple possible. Pour appeler cette vue, il s’agit de l’associer à une URL, et pour cela nous avons besoin d’un URLconf.</p>\n<p>Pour créer un URLconf dans le répertoire polls, créez un fichier nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">urls.py</span></code>. Votre répertoire d’application devrait maintenant ressembler à 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=\"n\">polls</span><span class=\"o\">/</span>\n    <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">apps</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">migrations</span><span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">tests</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">urls</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">py</span>\n</code></pre></div>\n<p>Dans le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/urls.py</span></code>, insérez le code suivant :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/urls.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">path</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;index&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>L’étape suivante est de faire pointer la configuration d””URL racine vers le module <code class=\"docutils literal notranslate\"><span class=\"pre\">polls.urls</span></code>. Dans <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/urls.py</span></code>, ajoutez une importation <code class=\"docutils literal notranslate\"><span class=\"pre\">django.urls.include</span></code> et insérez un appel <a class=\"reference internal\" href=\"/fr/2.2/ref/urls/#django.urls.include\" title=\"django.urls.include\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">include()</span></code></a> dans la liste <code class=\"docutils literal notranslate\"><span class=\"pre\">urlpatterns</span></code>, ce qui donnera :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">monsite/urls.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">include</span><span class=\"p\">,</span> <span class=\"n\">path</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;polls/&#39;</span><span class=\"p\">,</span> <span class=\"n\">include</span><span class=\"p\">(</span><span class=\"s1\">&#39;polls.urls&#39;</span><span class=\"p\">)),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;admin/&#39;</span><span class=\"p\">,</span> <span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">urls</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>La fonction <a class=\"reference internal\" href=\"/fr/2.2/ref/urls/#django.urls.include\" title=\"django.urls.include\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">include()</span></code></a> permet de référencer d’autres configurations d’URL. Quand Django rencontre un <a class=\"reference internal\" href=\"/fr/2.2/ref/urls/#django.urls.include\" title=\"django.urls.include\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">include()</span></code></a>, il tronque le bout d’URL qui correspondait jusque là et passe la chaîne de caractères restante à la configuration d’URL incluse pour continuer le traitement.</p>\n<p>L’idée derrière <a class=\"reference internal\" href=\"/fr/2.2/ref/urls/#django.urls.include\" title=\"django.urls.include\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">include()</span></code></a> est de faciliter la connexion d’URL. Comme l’application de sondages possède son propre URLconf (<code class=\"docutils literal notranslate\"><span class=\"pre\">polls/urls.py</span></code>), ses URL peuvent être injectés sous « /polls/ », sous « /fun_polls/ » ou sous « /content/polls/ » ou tout autre chemin racine sans que cela change quoi que ce soit au fonctionnement de l’application.</p>\n<aside class=\"admonition-when-to-use-func-django-urls-include admonition\">\n<p class=\"admonition-title\">Quand utiliser <a class=\"reference internal\" href=\"/fr/2.2/ref/urls/#django.urls.include\" title=\"django.urls.include\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">include()</span></code></a></p>\n<p>Il faut toujours utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">include()</span></code> lorsque l’on veut inclure d’autres motifs d’URL. <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.site.urls</span></code> est la seule exception à cette règle.</p>\n</aside>\n<p>Vous avez maintenant relié une vue <code class=\"docutils literal notranslate\"><span class=\"pre\">index</span></code> dans la configuration d’URL. Vérifiez qu’elle fonctionne avec la commande suivante :</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-6-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>runserver\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-6-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py runserver\n</code></pre></div></div></div>\n<p>Ouvrez <a class=\"reference external\" href=\"http://localhost:8000/polls/\">http://localhost:8000/polls/</a> dans votre navigateur et vous devriez voir le texte « <em>Hello, world. You’re at the polls index.</em> » qui a été défini dans la vue <code class=\"docutils literal notranslate\"><span class=\"pre\">index</span></code>.</p>\n<aside class=\"admonition-page-not-found admonition\">\n<p class=\"admonition-title\">Page non trouvée ?</p>\n<p>Si vous obtenez une page d’erreur ici, vérifiez que vous accédez bien à <a class=\"reference external\" href=\"http://localhost:8000/polls/\">http://localhost:8000/polls/</a> et non pas à <a class=\"reference external\" href=\"http://localhost:8000/\">http://localhost:8000/</a>.</p>\n</aside>\n<p>La fonction <a class=\"reference internal\" href=\"/fr/2.2/ref/urls/#django.urls.path\" title=\"django.urls.path\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">path()</span></code></a> reçoit quatre paramètres, dont deux sont obligatoires : <code class=\"docutils literal notranslate\"><span class=\"pre\">route</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">view</span></code>, et deux facultatifs : <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>. À ce stade, il est intéressant d’examiner le rôle de chacun de ces paramètres.</p>\n<section id=\"path-argument-route\">\n<h3>Paramètre de <a class=\"reference internal\" href=\"/fr/2.2/ref/urls/#django.urls.path\" title=\"django.urls.path\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">path()</span></code></a> : <code class=\"docutils literal notranslate\"><span class=\"pre\">route</span></code><a class=\"heading-anchor\" href=\"#path-argument-route\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">route</span></code> est une chaîne contenant un motif d’URL. Lorsqu’il traite une requête, Django commence par le premier motif dans <code class=\"docutils literal notranslate\"><span class=\"pre\">urlpatterns</span></code> puis continue de parcourir la liste en comparant l’URL reçue avec chaque motif jusqu’à ce qu’il en trouve un qui correspond.</p>\n<p>Les motifs ne cherchent pas dans les paramètres GET et POST, ni dans le nom de domaine. Par exemple, dans une requête vers <code class=\"docutils literal notranslate\"><span class=\"pre\">https://www.example.com/myapp/</span></code>, l’URLconf va chercher <code class=\"docutils literal notranslate\"><span class=\"pre\">myapp/</span></code>. Dans une requête vers <code class=\"docutils literal notranslate\"><span class=\"pre\">https://www.example.com/myapp/?page=3</span></code>, l’URLconf va aussi chercher <code class=\"docutils literal notranslate\"><span class=\"pre\">myapp/</span></code>.</p>\n</section>\n<section id=\"path-argument-view\">\n<h3>Paramètre de <a class=\"reference internal\" href=\"/fr/2.2/ref/urls/#django.urls.path\" title=\"django.urls.path\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">path()</span></code></a> : <code class=\"docutils literal notranslate\"><span class=\"pre\">view</span></code><a class=\"heading-anchor\" href=\"#path-argument-view\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Lorsque Django trouve un motif correspondant, il appelle la fonction de vue spécifiée, avec un objet <a class=\"reference internal\" href=\"/fr/2.2/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> comme premier paramètre et toutes les valeurs « capturées » par la route sous forme de paramètres nommés. Nous montrerons cela par un exemple un peu plus loin.</p>\n</section>\n<section id=\"path-argument-kwargs\">\n<h3>Paramètre de <a class=\"reference internal\" href=\"/fr/2.2/ref/urls/#django.urls.path\" title=\"django.urls.path\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">path()</span></code></a> : <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code><a class=\"heading-anchor\" href=\"#path-argument-kwargs\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Des paramètres nommés arbitraires peuvent être transmis dans un dictionnaire vers la vue cible. Nous n’allons pas exploiter cette fonctionnalité dans ce tutoriel.</p>\n</section>\n<section id=\"path-argument-name\">\n<h3>Paramètre de <a class=\"reference internal\" href=\"/fr/2.2/ref/urls/#django.urls.path\" title=\"django.urls.path\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">path()</span></code></a> : <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code><a class=\"heading-anchor\" href=\"#path-argument-name\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Le nommage des URL permet de les référencer de manière non ambiguë depuis d’autres portions de code Django, en particulier depuis les gabarits. Cette fonctionnalité puissante permet d’effectuer des changements globaux dans les modèles d’URL de votre projet en ne modifiant qu’un seul fichier.</p>\n<p>Lorsque vous serez familiarisé avec le flux de base des requêtes et réponses, lisez la <a class=\"reference internal\" href=\"/fr/2.2/intro/tutorial02/\"><span class=\"doc\">partie 2 de ce tutoriel</span></a> pour commencer de travailler avec la base de données.</p>\n</section>\n</section>","rootId":"writing-your-first-django-app-part-1","toc":[{"title":"Création d’un projet","anchor":"creating-a-project","children":[]},{"title":"Le serveur de développement","anchor":"the-development-server","children":[]},{"title":"Création de l’application Polls","anchor":"creating-the-polls-app","children":[]},{"title":"Écriture d’une première vue","anchor":"write-your-first-view","children":[{"title":"Paramètre de path() : route","anchor":"path-argument-route","children":[]},{"title":"Paramètre de path() : view","anchor":"path-argument-view","children":[]},{"title":"Paramètre de path() : kwargs","anchor":"path-argument-kwargs","children":[]},{"title":"Paramètre de path() : name","anchor":"path-argument-name","children":[]}]}],"breadcrumbs":[{"docname":"intro/index","title":"Premiers pas","url":"/fr/2.2/intro/"}],"prev":{"docname":"intro/install","title":"Guide d’installation rapide","url":"/fr/2.2/intro/install/"},"next":{"docname":"intro/tutorial02","title":"Écriture de votre première application Django, 2ème partie","url":"/fr/2.2/intro/tutorial02/"},"formats":{"html":"/fr/2.2/intro/tutorial01/","markdown":"/fr/2.2/intro/tutorial01.md","json":"/fr/2.2/intro/tutorial01.json"},"source":"https://github.com/django/django/blob/stable/2.2.x/docs/intro/tutorial01.txt","official":"https://docs.djangoproject.com/fr/2.2/intro/tutorial01/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}