{"title":"Écriture de votre premier correctif pour Django","version":"4.2","locale":"fr","docname":"intro/contributing","url":"/fr/4.2/intro/contributing/","canonical":"https://djangodocs.dev/fr/4.2/intro/contributing/","summary":"Introduction Lien vers cette rubrique # Intéressé à redonner un peu de votre temps à la communauté ? Vous avez peut-être trouvé un bogue dans Django et vous…","html":"<h1>Écriture de votre premier correctif pour Django<a class=\"heading-anchor\" href=\"#writing-your-first-patch-for-django\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"introduction\">\n<h2>Introduction<a class=\"heading-anchor\" href=\"#introduction\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Intéressé à redonner un peu de votre temps à la communauté ? Vous avez peut-être trouvé un bogue dans Django et vous souhaiteriez le corriger, ou alors vous aimeriez ajouter une petite fonctionnalité dans Django.</p>\n<p>La meilleure manière de réaliser ces objectifs est de contribuer à Django lui-même. Si cela peut paraître une tâche effrayante au premier abord, le chemin est tout tracé avec de la documentation, des outils ainsi qu’une communauté pour vous épauler. Nous allons vous accompagner tout au long de ce processus afin que vous puissiez apprendre par un exemple.</p>\n<section id=\"who-s-this-tutorial-for\">\n<h3>À qui est destiné ce tutoriel ?<a class=\"heading-anchor\" href=\"#who-s-this-tutorial-for\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Voir aussi</p>\n<p>Si vous cherchez une référence sur la façon de contribuer au code de Django, consultez la documentation <a class=\"reference internal\" href=\"/fr/4.2/internals/contributing/writing-code/\"><span class=\"doc\">Écriture du code</span></a>.</p>\n</aside>\n<p>Pour ce tutoriel, il s’agit d’avoir au moins une compréhension générale de la manière dont Django fonctionne. Cela implique que vous devez être à l’aise en parcourant les tutoriaux existants sur l’<a class=\"reference internal\" href=\"/fr/4.2/intro/tutorial01/\"><span class=\"doc\">écriture de votre première application Django</span></a>. De plus, vous devriez bien connaître Python lui-même. Si ce n’est pas le cas, <a class=\"reference external\" href=\"https://diveinto.org/python3/table-of-contents.html\">Dive Into Python</a> est un livre en ligne fantastique (et gratuit) pour les programmeurs Python débutants.</p>\n<p>Ceux d’entre vous qui ne sont pas familiers avec les systèmes de gestion de versions et avec Trac trouveront dans ce tutoriel et ses liens les bonnes informations pour bien démarrer. Toutefois, il serait souhaitable d’en apprendre un peu plus sur ces différents outils si vous pensez contribuer régulièrement à Django.</p>\n<p>Mais pour la plus grande partie, ce tutoriel vise à expliquer le plus possible de choses pour qu’il puisse convenir au plus grand nombre.</p>\n<aside class=\"admonition-where-to-get-help admonition\">\n<p class=\"admonition-title\">Où obtenir de l’aide :</p>\n<p>Si vous avez des problèmes en suivant ce tutoriel, vous pouvez écrire (en anglais)  sur le <a class=\"reference external\" href=\"https://forum.djangoproject.com/\">forum Django</a>, à la liste <a class=\"reference internal\" href=\"/fr/4.2/internals/mailing-lists/#django-developers-mailing-list\"><span class=\"std std-ref\">django-developers</span></a> ou utiliser le canal IRC <a class=\"reference external\" href=\"https://web.libera.chat/#django-dev\">#django-dev sur irc.libera.chat</a> (ou #django-fr en français) pour discuter avec d’autres utilisateurs Django qui pourront peut-être vous aider.</p>\n</aside>\n</section>\n<section id=\"what-does-this-tutorial-cover\">\n<h3>Quels sont les contenus de ce tutoriel ?<a class=\"heading-anchor\" href=\"#what-does-this-tutorial-cover\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Nous allons vous guider dans votre première contribution d’un correctif pour Django. À la fin de ce tutoriel, vous aurez acquis une compréhension basique à la fois des outils et des processus nécessaires. Plus particulièrement, nous aborderons les thèmes suivants :</p>\n<ul class=\"simple\">\n<li><p>installation de Git,</p></li>\n<li><p>Téléchargement d’une copie de la version de développement de Django.</p></li>\n<li><p>le lancement de la suite de tests de Django,</p></li>\n<li><p>l’écriture d’un test pour votre correctif,</p></li>\n<li><p>l’écriture du code du correctif,</p></li>\n<li><p>le test de votre correctif,</p></li>\n<li><p>la soumission d’une requête de contribution,</p></li>\n<li><p>les sources d’informations supplémentaires.</p></li>\n</ul>\n<p>Une fois le tutoriel terminé, vous pouvez consulter le reste de la <a class=\"reference internal\" href=\"/fr/4.2/internals/contributing/\"><span class=\"doc\">documentation de Django sur la façon de contribuer</span></a>. Elle contient de nombreuses informations utiles et constitue une lecture indispensable pour tout contributeur en herbe à Django. Si vous avez des questions, vous y trouverez probablement les réponses.</p>\n<aside class=\"admonition-python-3-required admonition\">\n<p class=\"admonition-title\">Python 3 indispensable !</p>\n<p>La version actuelle de Django ne prend plus en charge Python 2.7. Obtenez Python 3 depuis la <a class=\"reference external\" href=\"https://www.python.org/downloads/\">page des téléchargements de Python</a> ou par l’intermédiaire du gestionnaire des paquets de votre système.</p>\n</aside>\n<aside class=\"admonition-for-windows-users admonition\">\n<p class=\"admonition-title\">Pour les utilisateurs Windows</p>\n<p>Consultez <a class=\"reference internal\" href=\"/fr/4.2/howto/windows/#install-python-windows\"><span class=\"std std-ref\">Installation de Python</span></a> dans la documentation à propos de Windows pour de plus amples indications.</p>\n</aside>\n</section>\n</section>\n<section id=\"code-of-conduct\">\n<h2>Code de conduite<a class=\"heading-anchor\" href=\"#code-of-conduct\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>En tant que contributeur, vous pouvez nous aider à maintenir la communauté Django ouverte et accueillante. Lisez et respectez notre <a class=\"reference external\" href=\"https://www.djangoproject.com/conduct/\">Code de conduite</a>.</p>\n</section>\n<section id=\"installing-git\">\n<h2>Installation de Git<a class=\"heading-anchor\" href=\"#installing-git\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pour ce tutoriel, Git doit être installé afin de pouvoir télécharger la version actuelle de développement de Django et pour générer les fichiers correctifs contenant vos modifications.</p>\n<p>Pour savoir si Git est installé, saisissez <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span></code> sur une ligne de commande. Si vous obtenez un message vous indiquant que la commande n’a pas pu être trouvée, c’est que vous devez l’installer, voir <a class=\"reference external\" href=\"https://git-scm.com/download\">la page de téléchargement de Git</a>.</p>\n<p>Si vous ne connaissez pas bien Git, vous pouvez toujours obtenir des informations sur les commandes (une fois installé) en tapant <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">help</span></code> sur une ligne de commande.</p>\n</section>\n<section id=\"getting-a-copy-of-django-s-development-version\">\n<h2>Téléchargement d’une copie de la version de développement de Django<a class=\"heading-anchor\" href=\"#getting-a-copy-of-django-s-development-version\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>La première étape pour contribuer à Django est d’obtenir une copie de son code source. Commencez par <a class=\"reference external\" href=\"https://github.com/django/django/fork\">créer un fork de Django sur GitHub</a>. Puis, à partir de la ligne de commande, utilisez la commande <code class=\"docutils literal notranslate\"><span class=\"pre\">cd</span></code> pour vous placer dans le répertoire où vous souhaitez mettre votre copie locale de Django.</p>\n<p>Téléchargez le dépôt du code source de Django en utilisant la commande suivante :</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>git<span class=\"w\"> </span>clone<span class=\"w\"> </span>https://github.com/YourGitHubName/django.git\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> git clone https://github.com/YourGitHubName/django.git\n</code></pre></div></div></div>\n<aside class=\"admonition-low-bandwidth-connection admonition\">\n<p class=\"admonition-title\">Connexion à faible bande passante ?</p>\n<p>Vous pouvez ajouter l’option <code class=\"docutils literal notranslate\"><span class=\"pre\">--depth</span> <span class=\"pre\">1</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">clone</span></code> pour éviter le téléchargement de l’historique complet de Django, ce qui réduit le transfert de données de ~250 Mo à ~70 Mo.</p>\n</aside>\n<p>Maintenant que vous disposez d’une copie locale de Django, vous pouvez l’installer comme tout autre paquet à l’aide de <code class=\"docutils literal notranslate\"><span class=\"pre\">pip</span></code>. La façon la plus simple de le faire est d’utiliser un <em>environnement virtuel</em>, qui est une fonctionnalité de Python permettant d’isoler dans une répertoire dédié les paquets installés pour chacun de vos projets afin qu’ils n’interfèrent pas entre eux.</p>\n<p>Il est conseillé de conserver tous les environnements virtuels au même endroit, par exemple dans <code class=\"docutils literal notranslate\"><span class=\"pre\">.virtualenvs/</span></code> dans votre dossier personnel.</p>\n<p>Créez un nouvel environnement virtuel en exécutant :</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>python3<span class=\"w\"> </span>-m<span class=\"w\"> </span>venv<span class=\"w\"> </span>~/.virtualenvs/djangodev\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> py -m venv <span class=\"nv\">%HOMEPATH%</span>\\.virtualenvs\\djangodev\n</code></pre></div></div></div>\n<p>Le chemin correspond à l’endroit où le nouvel environnement sera enregistré sur votre ordinateur.</p>\n<p>La dernière étape de configuration de l’environnement virtuel est de l’activer :</p>\n<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><span class=\"nb\">source</span><span class=\"w\"> </span>~/.virtualenvs/djangodev/bin/activate\n</code></pre></div>\n<p>Si la commande <code class=\"docutils literal notranslate\"><span class=\"pre\">source</span></code> n’est pas disponible, vous pouvez essayer d’utiliser un point à la place :</p>\n<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>.<span class=\"w\"> </span>~/.virtualenvs/djangodev/bin/activate\n</code></pre></div>\n<p>Vous devez activer l’environnement virtuel chaque fois que vous ouvrez une nouvelle fenêtre de terminal.</p>\n<aside class=\"admonition-for-windows-users admonition\">\n<p class=\"admonition-title\">Pour les utilisateurs Windows</p>\n<p>Pour activer votre environnement virtuel sur Windows, lancez :</p>\n<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 code\"><code><span class=\"gp\">...\\&gt;</span> <span class=\"nv\">%HOMEPATH%</span>\\.virtualenvs\\djangodev\\Scripts\\activate.bat\n</code></pre></div>\n</aside>\n<p>Le nom de l’environnement virtuel actuellement actif est affiché sur la ligne de commande pour vous aider à voir d’un coup d’œil lequel est activé. Tout ce que vous installez avec <code class=\"docutils literal notranslate\"><span class=\"pre\">pip</span></code> quand ce nom est affiché sera installé dans cet environnement virtuel, isolé des autres environnements et des paquets du système.</p>\n<p id=\"intro-contributing-install-local-copy\">Poursuivez en installant la copie de Django précédemment chargée :</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>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>-e<span class=\"w\"> </span>/path/to/your/local/clone/django/\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 -m pip install -e \\path\\to\\your\\local\\clone\\django\\\n</code></pre></div></div></div>\n<p>La version installée de Django correspond maintenant à votre copie locale grâce à cette installation en mode éditable. Vous constaterez immédiatement les effets de toute modification, ce qui est très utile lorsqu’on se met à écrire des correctifs.</p>\n<section id=\"creating-projects-with-a-local-copy-of-django\">\n<h3>Création de projets avec une copie locale de Django<a class=\"heading-anchor\" href=\"#creating-projects-with-a-local-copy-of-django\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Il peut être utile de tester vos modifications locales avec un projet Django. Vous devez d’abord créer un nouvel environnement virtuel, <a class=\"reference internal\" href=\"#intro-contributing-install-local-copy\"><span class=\"std std-ref\">installer la copie locale de Django précédemment clonée en mode éditable</span></a>, et créer un nouveau projet Django en dehors de la copie locale de Django. Vous verrez immédiatement les effets de tout changement du code Django dans votre nouveau projet, ce qui peut être fort utile lors de l’écriture de votre premier correctif, particulièrement si vous voulez tester des modifications dans l’interface utilisateur.</p>\n<p>Vous pouvez suivre le <a class=\"reference internal\" href=\"/fr/4.2/intro/tutorial01/\"><span class=\"doc\">tutoriel</span></a> pour obtenir de l’aide à la création d’un projet Django.</p>\n</section>\n</section>\n<section id=\"running-django-s-test-suite-for-the-first-time\">\n<h2>Lancement de la suite de test de Django pour la première fois<a class=\"heading-anchor\" href=\"#running-django-s-test-suite-for-the-first-time\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>En contribuant à Django, il est très important que vos modifications de code n’introduisent pas de bogues dans d’autres parties de Django. Une des façons de contrôler que Django fonctionne toujours après vos modifications est de lancer la suite de tests de Django. Si tous les tests passent, il est raisonnable de penser que vos modifications fonctionnent et n’ont pas cassé d’autres parties de Django. Si vous n’avez encore jamais lancé la suite de tests de Django, il est recommandé de le faire une fois au préalable pour vous familiariser avec le résultat obtenu.</p>\n<p>Avant de lancer la suite de tests, entrez dans le répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> de Django avec la commande <code class=\"docutils literal notranslate\"><span class=\"pre\">cd</span> <span class=\"pre\">tests</span></code> et installez les dépendances de test en exécutant :</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>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>-r<span class=\"w\"> </span>requirements/py3.txt\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 -m pip install -r requirements\\py3.txt\n</code></pre></div></div></div>\n<p>Si vous rencontrez une erreur durant l’installation, il est possible qu’une dépendance pour un ou plusieurs paquets Python manque sur votre système. Consultez la documentation du paquet problématique ou recherchez sur le Web avec le message d’erreur obtenu.</p>\n<p>Nous sommes maintenant prêts à lancer la suite de tests. Si vous utilisez GNU/Linux, macOS ou une autre version de Unix, lancez :</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>./runtests.py\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> runtests.py \n</code></pre></div></div></div>\n<p>Maintenant prenez place et détendez-vous. La suite complète de tests Django contient des milliers de tests, ce qui prend plusieurs minutes au moins à s’exécuter, en fonction de la rapidité de votre ordinateur.</p>\n<p>Pendant que la suite de tests de Django s’exécute, vous voyez un flux de caractères représentant le statut de chaque test exécuté. <code class=\"docutils literal notranslate\"><span class=\"pre\">E</span></code> indique qu’une erreur est survenue durant le test et <code class=\"docutils literal notranslate\"><span class=\"pre\">F</span></code> indique qu’une assertion de test a échoué. Les deux sont considérés comme des échecs. Quant à eux, <code class=\"docutils literal notranslate\"><span class=\"pre\">x</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">s</span></code> indiquent respectivement des échecs attendus et des tests omis volontairement. Chaque point signifie qu’un test a réussi.</p>\n<p>Les tests omis volontairement sont typiquement dus à des bibliothèques externes manquantes et nécessaires pour exécuter ces tests ; voir <a class=\"reference internal\" href=\"/fr/4.2/internals/contributing/writing-code/unit-tests/#running-unit-tests-dependencies\"><span class=\"std std-ref\">Lancement de tous les tests</span></a> pour une liste de dépendances. Prenez soin d’installer toute dépendance de test qui est liée aux modifications que vous appliquez (nous n’en utiliserons pas pour ce tutoriel). Certains tests sont spécifiques à un moteur de base de données particulier et seront sautés lors des tests avec les autres moteurs. SQLite est le moteur de base de données des réglages par défaut. Pour lancer les tests avec un moteur différent, consultez <a class=\"reference internal\" href=\"/fr/4.2/internals/contributing/writing-code/unit-tests/#running-unit-tests-settings\"><span class=\"std std-ref\">Utilisation d’un autre module de réglages settings</span></a>.</p>\n<p>Lorsque les tests sont terminés, vous devez voir apparaître un message vous informant si la suite de tests a réussi ou échoué. Comme vous n’avez encore pas modifié de code Django, toute la suite de tests <strong>devrait</strong> passer. Si vous obtenez des échecs ou des erreurs, vérifiez que vous avez bien suivi toutes les précédentes étapes. Consultez <a class=\"reference internal\" href=\"/fr/4.2/internals/contributing/writing-code/unit-tests/#running-unit-tests\"><span class=\"std std-ref\">Lancement des tests unitaires</span></a> pour plus d’informations.</p>\n<p>Il faut savoir que la version <code class=\"docutils literal notranslate\"><span class=\"pre\">main</span></code> (la plus actuelle) de Django n’est pas toujours stable. Lorsque vous développez sur cette version, vous pouvez vérifier les <a class=\"reference external\" href=\"https://djangoci.com\">compilations d’intégration continue de Django</a> pour savoir si les échecs que vous obtenez sont spécifiques à votre environnement ou s’ils sont aussi présents dans les compilations officielles de Django. Si vous cliquez sur une compilation particulière, vous voyez la « matrice de configurations » qui indique les échecs précisément par version de Python et par moteur de base de données.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Pour ce tutoriel et le ticket sur lequel nous travaillons, il est suffisant de tester avec SQLite. Cependant, il est possible (et parfois nécessaire) de <a class=\"reference internal\" href=\"/fr/4.2/internals/contributing/writing-code/unit-tests/#running-unit-tests-settings\"><span class=\"std std-ref\">lancer les tests en utilisant une base de données différente</span></a>. Lorsque vous apportez des modifications à l’interface utilisateur, vous aurez besoin de <a class=\"reference internal\" href=\"/fr/4.2/internals/contributing/writing-code/unit-tests/#running-selenium-tests\"><span class=\"std std-ref\">lancer les tests Selenium</span></a>.</p>\n</aside>\n</section>\n<section id=\"working-on-a-feature\">\n<h2>Travail sur une fonctionnalité<a class=\"heading-anchor\" href=\"#working-on-a-feature\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pour ce tutoriel, nous allons travailler sur un ticket factice comme cas d’étude. Voici les détails imaginaires :</p>\n<aside class=\"admonition-ticket-99999-allow-making-toast admonition\">\n<p class=\"admonition-title\">Ticket #99999 – Permettre de faire des toasts</p>\n<p>Django devrait fournir une fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">django.shortcuts.make_toast()</span></code> qui renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">'toast'</span></code>.</p>\n</aside>\n<p>Nous allons maintenant implémenter cette fonctionnalité et les tests qui l’accompagnent.</p>\n</section>\n<section id=\"creating-a-branch-for-your-patch\">\n<h2>Création d’une branche pour le correctif<a class=\"heading-anchor\" href=\"#creating-a-branch-for-your-patch\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Avant toute modification, créez une nouvelle branche pour le ticket :</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>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>-b<span class=\"w\"> </span>ticket_99999\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> git checkout -b ticket_99999\n</code></pre></div></div></div>\n<p>Vous êtes libre de choisir le nom de la branche, « ticket_99999 » est un exemple. Toutes les modifications appliquées dans cette branche seront spécifiques au ticket et ne toucheront pas la copie principale du code que nous avons clonée précédemment.</p>\n</section>\n<section id=\"writing-some-tests-for-your-ticket\">\n<h2>Écriture de quelques tests pour le ticket<a class=\"heading-anchor\" href=\"#writing-some-tests-for-your-ticket\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Dans la majorité des cas, un correctif doit contenir des tests pour être accepté dans Django. Pour les correctifs de correction de bogue, cela implique la rédaction d’une test de régression pour s’assurer que le bogue ne soit plus réintroduit plus tard dans Django. Un test de régression doit être écrit de façon à échouer tant que le bogue est présent et à réussir lorsque le bogue a été corrigé. En ce qui concerne les correctifs contenant de nouvelles fonctionnalités, vous devrez inclure des tests qui assurent que les nouvelles fonctionnalités fonctionnent correctement. Ces tests devraient aussi échouer avant que la fonctionnalité ne soit développée, et réussir après qu’elle a été implémentée.</p>\n<p>Une bonne manière de faire cela est d’écrire d’abord les nouveaux tests, avant de toucher au code. Ce style de développement est appelé <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Test-driven_development\">développement piloté par les tests</a> et peut être appliqué aussi bien à des projets complets qu’à des correctifs individuels. Après avoir écrit les tests, vous les lancez pour être sûr qu’ils échouent effectivement (puisque vous n’avez pas encore corrigé l’erreur ou ajouté la fonctionnalité). Si vos nouveaux tests n’échouent pas, vous devez les corriger jusqu’à ce qu’ils échouent. Après tout, un test de régression qui passe que le bogue soit présent ou non n’est pas très utile pour éviter que ce bogue ne réapparaisse à l’avenir.</p>\n<p>Entrons maintenant dans le vif du sujet.</p>\n<section id=\"writing-a-test-for-ticket-99999\">\n<h3>Écriture d’un test pour le ticket #99999<a class=\"heading-anchor\" href=\"#writing-a-test-for-ticket-99999\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Afin de résoudre ce ticket, nous allons ajouter une fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">make_toast()</span></code> au module <code class=\"docutils literal notranslate\"><span class=\"pre\">django.shortcuts</span></code>. Pour commencer, nous écrirons un test qui essaie d’utiliser cette fonction et qui vérifie que son résultat est correct.</p>\n<p>Placez-vous dans le dossier <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/shortcuts/</span></code> et créez un nouveau fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">test_make_toast.py</span></code>. Ajoutez le code suivant</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.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">make_toast</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SimpleTestCase</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MakeToastTests</span><span class=\"p\">(</span><span class=\"n\">SimpleTestCase</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_make_toast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertEqual</span><span class=\"p\">(</span><span class=\"n\">make_toast</span><span class=\"p\">(),</span> <span class=\"s2\">&quot;toast&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Ce test vérifie que la fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">make_toast()</span></code> renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">'toast'</span></code>.</p>\n<aside class=\"admonition-but-this-testing-thing-looks-kinda-hard admonition\">\n<p class=\"admonition-title\">Mais cette histoire de tests semble plutôt compliquée…</p>\n<p>Si vous n’avez jamais eu affaire à des tests précédemment, ils peuvent paraître un peu difficiles à écrire au premier abord. Heureusement, les tests sont un sujet <em>très</em> important en programmation, il existe donc beaucoup d’informations à leur sujet :</p>\n<ul class=\"simple\">\n<li><p>Une première approche conseillée dans l’écriture de tests pour Django est de parcourir la documentation <a class=\"reference internal\" href=\"/fr/4.2/topics/testing/overview/\"><span class=\"doc\">Écriture et lancement de tests</span></a>.</p></li>\n<li><p>Dive Into Python (un livre en ligne gratuit pour les développeurs débutants en Python) contient une très bonne section sur l”<a class=\"reference external\" href=\"https://diveinto.org/python3/unit-testing.html\">introduction aux tests unitaires</a>.</p></li>\n<li><p>Après ces lectures, si vous désirez un peu plus de matière à digérer, vous pouvez toujours parcourir la documentation Python de <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#module-unittest\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">unittest</span></code></a>.</p></li>\n</ul>\n</aside>\n</section>\n<section id=\"running-your-new-test\">\n<h3>Lancement des nouveaux tests<a class=\"heading-anchor\" href=\"#running-your-new-test\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Comme nous n’avons encore effectué aucune modification à <code class=\"docutils literal notranslate\"><span class=\"pre\">django.shortcuts</span></code>, notre test est censé échouer. Lançons tous les tests dans le dossier <code class=\"docutils literal notranslate\"><span class=\"pre\">shortcuts</span></code> pour être certain que c’est vraiment ce qui va se passer. Placez-vous dans le répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> de Django et lancez :</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>./runtests.py<span class=\"w\"> </span>shortcuts\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> runtests.py shortcuts\n</code></pre></div></div></div>\n<p>Si les tests se sont déroulés correctement, vous devriez voir un échec correspondant à la méthode de test que nous avons ajoutée, avec cette erreur :</p>\n<div class=\"code-block\" data-language=\"pytb\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Pytb</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=\"Pytb code\"><code><span class=\"x\">ImportError: cannot import name &#39;make_toast&#39; from &#39;django.shortcuts&#39;</span>\n</code></pre></div>\n<p>Si tous les tests ont réussi, vous devriez alors vérifier que vous avez bien ajouté les nouveaux tests ci-dessus dans le bon répertoire et le bon nom de fichier.</p>\n</section>\n</section>\n<section id=\"writing-the-code-for-your-ticket\">\n<h2>Écriture du code pour le ticket<a class=\"heading-anchor\" href=\"#writing-the-code-for-your-ticket\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ensuite, nous allons ajouter la fonction <code class=\"docutils literal notranslate\"><span class=\"pre\">make_toast()</span></code>.</p>\n<p>Passez dans le dossier <code class=\"docutils literal notranslate\"><span class=\"pre\">django/</span></code> et ouvrez le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">shortcuts.py</span></code>. Au bas du fichier, ajoutez</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_toast</span><span class=\"p\">():</span>\n    <span class=\"k\">return</span> <span class=\"s2\">&quot;toast&quot;</span>\n</code></pre></div>\n<p>Nous devons maintenant être sûrs que le test précédemment écrit réussit, afin de vérifier que le code que nous venons d’ajouter fonctionne correctement. Placez-vous une nouvelle fois dans le répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> de Django et lancez :</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-7-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>./runtests.py<span class=\"w\"> </span>shortcuts\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-7-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> runtests.py shortcuts\n</code></pre></div></div></div>\n<p>Tous les tests devraient réussir. Si ce n’est pas le cas, assurez-vous d’avoir ajouté la bonne fonction dans le bon fichier.</p>\n</section>\n<section id=\"running-django-s-test-suite-for-the-second-time\">\n<h2>Lancement de la suite de tests de Django pour la seconde fois<a class=\"heading-anchor\" href=\"#running-django-s-test-suite-for-the-second-time\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Après avoir vérifié que votre correctif et les tests fonctionnent correctement, il est recommandé de relancer toute la suite de tests de Django pour contrôler que vos modifications n’ont pas introduit des bogues dans d’autres parties de Django. Même si quand la suite de tests passe entièrement, ce n’est toujours pas une garantie que votre code ne contient pas d’erreurs, cela aide tout de même à révéler de nombreux bogues et régressions qui pourraient être passés inaperçus.</p>\n<p>Pour lancer la suite complète de tests de Django, placez-vous dans le répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> de Django et lancez :</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-8-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>./runtests.py\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-8-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> runtests.py \n</code></pre></div></div></div>\n</section>\n<section id=\"writing-documentation\">\n<h2>Écriture de la documentation<a class=\"heading-anchor\" href=\"#writing-documentation\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ceci est une nouvelle fonctionnalité, elle doit donc être documentée. Ouvrez le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">docs/topics/http/shortcuts.txt</span></code>  et ajoutez le contenu ci-après à la fin du fichier :</p>\n<div class=\"code-block\" data-language=\"rst\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Rst</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=\"Rst code\"><code><span class=\"gh\">``make_toast()``</span>\n<span class=\"gh\">================</span>\n\n<span class=\"p\">..</span> <span class=\"ow\">function</span><span class=\"p\">::</span> make_toast()\n\n<span class=\"p\">..</span> <span class=\"ow\">versionadded</span><span class=\"p\">::</span> 2.2\n\nReturns <span class=\"s\">``&#39;toast&#39;``</span>.\n</code></pre></div>\n<p>Comme cette nouvelle fonctionnalité sera présente dans une version à venir, nous la mentionnons aussi dans les notes de publication de la prochaine version de Django. Ouvrez les notes de publication de la version la plus récente dans <code class=\"docutils literal notranslate\"><span class=\"pre\">docs/releases/</span></code> (<code class=\"docutils literal notranslate\"><span class=\"pre\">2.2.txt</span></code> au moment de cette rédaction). Ajoutez une note sous le chapitre « Minor Features »:</p>\n<div class=\"code-block\" data-language=\"rst\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Rst</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=\"Rst code\"><code><span class=\"gh\">:mod:`django.shortcuts`</span>\n<span class=\"gh\">~~~~~~~~~~~~~~~~~~~~~~~</span>\n\n<span class=\"m\">*</span> The new <span class=\"na\">:func:</span><span class=\"nv\">`django.shortcuts.make_toast`</span> function returns <span class=\"s\">``&#39;toast&#39;``</span>.\n</code></pre></div>\n<p>Pour plus d’informations sur l’écriture de documentation, y compris une explication sur la signification de <code class=\"docutils literal notranslate\"><span class=\"pre\">versionadded</span></code>, consultez <a class=\"reference internal\" href=\"/fr/4.2/internals/contributing/writing-documentation/\"><span class=\"doc\">Écrire la documentation</span></a>. Cette page contient aussi une explication sur la manière de produire une copie locale de la documentation afin de pouvoir prévisualiser le code HTML qui sera généré.</p>\n</section>\n<section id=\"previewing-your-changes\">\n<h2>Aperçu des changements<a class=\"heading-anchor\" href=\"#previewing-your-changes\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Il est temps maintenant de passer en revue toutes les modifications effectuées dans notre correctif. Pour approuver toutes les modifications prêtes pour le commit, exécutez :</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-9-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>git<span class=\"w\"> </span>add<span class=\"w\"> </span>--all\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-9-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> git add --all\n</code></pre></div></div></div>\n<p>Puis affichez les différences entre votre copie actuelle de Django (incluant vos modifications) et la révision que vous avez initialement extraite précédemment dans ce tutoriel avec :</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-10-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>git<span class=\"w\"> </span>diff<span class=\"w\"> </span>--cached\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-10-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> git diff --cached\n</code></pre></div></div></div>\n<p>Utilisez les touches fléchées pour avancer ou reculer.</p>\n<div class=\"code-block\" data-language=\"diff\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Diff</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=\"Diff code\"><code><span class=\"gh\">diff --git a/django/shortcuts.py b/django/shortcuts.py</span>\n<span class=\"gh\">index 7ab1df0e9d..8dde9e28d9 100644</span>\n<span class=\"gd\">--- a/django/shortcuts.py</span>\n<span class=\"gi\">+++ b/django/shortcuts.py</span>\n<span class=\"gu\">@@ -156,3 +156,7 @@ def resolve_url(to, *args, **kwargs):</span>\n\n<span class=\"w\"> </span>    # Finally, fall back and assume it&#39;s a URL\n<span class=\"w\"> </span>    return to\n<span class=\"gi\">+</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+def make_toast():</span>\n<span class=\"gi\">+    return &#39;toast&#39;</span>\n<span class=\"gh\">diff --git a/docs/releases/2.2.txt b/docs/releases/2.2.txt</span>\n<span class=\"gh\">index 7d85d30c4a..81518187b3 100644</span>\n<span class=\"gd\">--- a/docs/releases/2.2.txt</span>\n<span class=\"gi\">+++ b/docs/releases/2.2.txt</span>\n<span class=\"gu\">@@ -40,6 +40,11 @@ database constraints. Constraints are added to models using the</span>\n<span class=\"w\"> </span>Minor features\n<span class=\"w\"> </span>--------------\n\n<span class=\"gi\">+:mod:`django.shortcuts`</span>\n<span class=\"gi\">+~~~~~~~~~~~~~~~~~~~~~~~</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+* The new :func:`django.shortcuts.make_toast` function returns ``&#39;toast&#39;``.</span>\n<span class=\"gi\">+</span>\n<span class=\"w\"> </span>:mod:`django.contrib.admin`\n<span class=\"w\"> </span>~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n<span class=\"gh\">diff --git a/docs/topics/http/shortcuts.txt b/docs/topics/http/shortcuts.txt</span>\n<span class=\"gh\">index 7b3a3a2c00..711bf6bb6d 100644</span>\n<span class=\"gd\">--- a/docs/topics/http/shortcuts.txt</span>\n<span class=\"gi\">+++ b/docs/topics/http/shortcuts.txt</span>\n<span class=\"gu\">@@ -271,3 +271,12 @@ This example is equivalent to::</span>\n<span class=\"w\"> </span>        my_objects = list(MyModel.objects.filter(published=True))\n<span class=\"w\"> </span>        if not my_objects:\n<span class=\"w\"> </span>            raise Http404(&quot;No MyModel matches the given query.&quot;)\n<span class=\"gi\">+</span>\n<span class=\"gi\">+``make_toast()``</span>\n<span class=\"gi\">+================</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+.. function:: make_toast()</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+.. versionadded:: 2.2</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+Returns ``&#39;toast&#39;``.</span>\n<span class=\"gh\">diff --git a/tests/shortcuts/test_make_toast.py b/tests/shortcuts/test_make_toast.py</span>\nnew file mode 100644\n<span class=\"gh\">index 0000000000..6f4c627b6e</span>\n<span class=\"gd\">--- /dev/null</span>\n<span class=\"gi\">+++ b/tests/shortcuts/test_make_toast.py</span>\n<span class=\"gu\">@@ -0,0 +1,7 @@</span>\n<span class=\"gi\">+from django.shortcuts import make_toast</span>\n<span class=\"gi\">+from django.test import SimpleTestCase</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+class MakeToastTests(SimpleTestCase):</span>\n<span class=\"gi\">+    def test_make_toast(self):</span>\n<span class=\"gi\">+        self.assertEqual(make_toast(), &#39;toast&#39;)</span>\n</code></pre></div>\n<p>Lorsque la relecture du correctif est terminée, pressez sur la touche <code class=\"docutils literal notranslate\"><span class=\"pre\">q</span></code> pour revenir à la ligne de commande. Si le contenu du correctif est bon, il est temps de valider les modifications.</p>\n</section>\n<section id=\"committing-the-changes-in-the-patch\">\n<h2>Validation (commit) des modifications du correctif<a class=\"heading-anchor\" href=\"#committing-the-changes-in-the-patch\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pour valider les modifications :</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-11-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>git<span class=\"w\"> </span>commit\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-11-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> git commit\n</code></pre></div></div></div>\n<p>Un éditeur de texte apparaît pour rédiger le message de commit. Suivez les <a class=\"reference internal\" href=\"/fr/4.2/internals/contributing/committing-code/#committing-guidelines\"><span class=\"std std-ref\">lignes directrices des messages de commit</span></a> et écrivez un message comme :</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>Fixed #99999 -- Added a shortcut function to make toast.\n</code></pre></div>\n</section>\n<section id=\"pushing-the-commit-and-making-a-pull-request\">\n<h2>Envoi du commit et création de la requête de contribution<a class=\"heading-anchor\" href=\"#pushing-the-commit-and-making-a-pull-request\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Après avoir validé le correctif (commit), envoyez-le vers votre fork GitHub (remplacez « ticket_99999 » par le nom de votre branche) :</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-12-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>git<span class=\"w\"> </span>push<span class=\"w\"> </span>origin<span class=\"w\"> </span>ticket_99999\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-12-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> git push origin ticket_99999\n</code></pre></div></div></div>\n<p>Vous pouvez créer une requête de contribution en visitant la <a class=\"reference external\" href=\"https://github.com/django/django/\">page GitHub de Django</a>. Vous verrez votre branche sous « Your recently pushed branches ». Cliquez sur « Compare &amp; pull request » à côté du message.</p>\n<p>Ne le faites pas réellement pour ce tutoriel, mais sur la page suivante qui affiche l’aperçu du correctif, vous devriez cliquez sur « Create pull request ».</p>\n</section>\n<section id=\"next-steps\">\n<h2>Étapes suivantes<a class=\"heading-anchor\" href=\"#next-steps\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Félicitations, vous avez appris comment effectuer une requête de contribution pour Django ! Des détails sur des techniques plus avancées sont disponibles dans <a class=\"reference internal\" href=\"/fr/4.2/internals/contributing/writing-code/working-with-git/\"><span class=\"doc\">Travailler avec Git et GitHub</span></a>.</p>\n<p>Vous pouvez mettre à profit maintenant ces compétences en aidant à améliorer la base de code de Django.</p>\n<section id=\"more-information-for-new-contributors\">\n<h3>Plus d’informations pour les nouveaux contributeurs<a class=\"heading-anchor\" href=\"#more-information-for-new-contributors\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Avant de vous impliquer plus intensément dans l’écriture de correctifs pour Django, il est souhaitable de parcourir un peu plus d’informations destinées aux contributeurs :</p>\n<ul class=\"simple\">\n<li><p>Il est important de lire la documentation de Django sur l’<a class=\"reference internal\" href=\"/fr/4.2/internals/contributing/writing-code/submitting-patches/\"><span class=\"doc\">appropriation de tickets et la soumission de correctifs</span></a>. Cela comprend les règles de comportement sur Trac, la façon de vous assigner un ticket, le style attendu du code des correctifs et encore bien d’autres détails importants.</p></li>\n<li><p>Les contributeurs débutants devraient aussi lire la <a class=\"reference internal\" href=\"/fr/4.2/internals/contributing/new-contributors/\"><span class=\"doc\">documentation de Django pour les contributeurs débutants</span></a>. Elle contient de nombreux bons conseils pour ceux d’entre nous qui débutent dans la contribution à Django.</p></li>\n<li><p>Après cela, si vous êtes toujours avide de plus d’informations sur la contribution, vous pouvez toujours parcourir le reste de la <a class=\"reference internal\" href=\"/fr/4.2/internals/contributing/\"><span class=\"doc\">documentation de Django sur la contribution</span></a>. Elle contient plein d’informations utiles et devrait constituer votre source principale de réponses aux questions que vous vous posez.</p></li>\n</ul>\n</section>\n<section id=\"finding-your-first-real-ticket\">\n<h3>Recherche de votre premier vrai ticket<a class=\"heading-anchor\" href=\"#finding-your-first-real-ticket\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Après avoir consulté une partie de ces informations, vous êtes fin prêt pour partir à la recherche d’un ticket pour lequel vous allez écrire un correctif. Commencez en priorité par les tickets marqués comme « Easy pickings » (résolution facile). Ces tickets sont souvent plus simples par nature et sont une cible idéale pour les contributeurs débutants. Lorsque vous serez à l’aise avec la contribution à Django, vous pourrez alors passer à la rédaction de correctifs pour des tickets plus difficiles.</p>\n<p>Si vous voulez commencer tout de suite (et personne ne vous le reprochera), jetez un coup d’œil à la liste des <a class=\"reference external\" href=\"https://code.djangoproject.com/query?status=new&amp;status=reopened&amp;has_patch=0&amp;easy=1&amp;col=id&amp;col=summary&amp;col=status&amp;col=owner&amp;col=type&amp;col=milestone&amp;order=priority\">tickets simples qui ont besoin d’un correctif</a> et des <a class=\"reference external\" href=\"https://code.djangoproject.com/query?status=new&amp;status=reopened&amp;needs_better_patch=1&amp;easy=1&amp;col=id&amp;col=summary&amp;col=status&amp;col=owner&amp;col=type&amp;col=milestone&amp;order=priority\">tickets simples qui ont des correctifs nécessitant une amélioration</a>. Si vous êtes à l’aise dans l’écriture de tests, vous pouvez aussi examiner la liste des <a class=\"reference external\" href=\"https://code.djangoproject.com/query?status=new&amp;status=reopened&amp;needs_tests=1&amp;easy=1&amp;col=id&amp;col=summary&amp;col=status&amp;col=owner&amp;col=type&amp;col=milestone&amp;order=priority\">tickets simples qui ont besoin de tests</a>. N’oubliez pas de suivre les instructions sur l’attribution de tickets qui étaient mentionnées dans le lien sur la documentation de Django sur l’<a class=\"reference internal\" href=\"/fr/4.2/internals/contributing/writing-code/submitting-patches/\"><span class=\"doc\">appropriation de tickets et la soumission de correctifs</span></a>.</p>\n</section>\n<section id=\"what-s-next-after-creating-a-pull-request\">\n<h3>Que se passe-t-il après la création d’une requête de contribution ?<a class=\"heading-anchor\" href=\"#what-s-next-after-creating-a-pull-request\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Quand un ticket possède un correctif, il doit être relu par une deuxième paire d’yeux. Après la soumission d’une requête de contribution, mettez à jour les métadonnées du ticket en définissant les drapeaux du ticket « has patch », « doesn’t need tests », etc, pour que d’autres puissent les retrouver en vue d’une relecture. Contribuer ne signifie pas nécessairement écrire un correctif à partir de zéro. La relecture de correctifs existants est également une contribution très utile. Consultez  <a class=\"reference internal\" href=\"/fr/4.2/internals/contributing/triaging-tickets/\"><span class=\"doc\">Tri des tickets</span></a> pour plus de détails.</p>\n</section>\n</section>","rootId":"writing-your-first-patch-for-django","toc":[{"title":"Introduction","anchor":"introduction","children":[{"title":"À qui est destiné ce tutoriel ?","anchor":"who-s-this-tutorial-for","children":[]},{"title":"Quels sont les contenus de ce tutoriel ?","anchor":"what-does-this-tutorial-cover","children":[]}]},{"title":"Code de conduite","anchor":"code-of-conduct","children":[]},{"title":"Installation de Git","anchor":"installing-git","children":[]},{"title":"Téléchargement d’une copie de la version de développement de Django","anchor":"getting-a-copy-of-django-s-development-version","children":[{"title":"Création de projets avec une copie locale de Django","anchor":"creating-projects-with-a-local-copy-of-django","children":[]}]},{"title":"Lancement de la suite de test de Django pour la première fois","anchor":"running-django-s-test-suite-for-the-first-time","children":[]},{"title":"Travail sur une fonctionnalité","anchor":"working-on-a-feature","children":[]},{"title":"Création d’une branche pour le correctif","anchor":"creating-a-branch-for-your-patch","children":[]},{"title":"Écriture de quelques tests pour le ticket","anchor":"writing-some-tests-for-your-ticket","children":[{"title":"Écriture d’un test pour le ticket #99999","anchor":"writing-a-test-for-ticket-99999","children":[]},{"title":"Lancement des nouveaux tests","anchor":"running-your-new-test","children":[]}]},{"title":"Écriture du code pour le ticket","anchor":"writing-the-code-for-your-ticket","children":[]},{"title":"Lancement de la suite de tests de Django pour la seconde fois","anchor":"running-django-s-test-suite-for-the-second-time","children":[]},{"title":"Écriture de la documentation","anchor":"writing-documentation","children":[]},{"title":"Aperçu des changements","anchor":"previewing-your-changes","children":[]},{"title":"Validation (commit) des modifications du correctif","anchor":"committing-the-changes-in-the-patch","children":[]},{"title":"Envoi du commit et création de la requête de contribution","anchor":"pushing-the-commit-and-making-a-pull-request","children":[]},{"title":"Étapes suivantes","anchor":"next-steps","children":[{"title":"Plus d’informations pour les nouveaux contributeurs","anchor":"more-information-for-new-contributors","children":[]},{"title":"Recherche de votre premier vrai ticket","anchor":"finding-your-first-real-ticket","children":[]},{"title":"Que se passe-t-il après la création d’une requête de contribution ?","anchor":"what-s-next-after-creating-a-pull-request","children":[]}]}],"breadcrumbs":[{"docname":"intro/index","title":"Premiers pas","url":"/fr/4.2/intro/"}],"prev":{"docname":"intro/whatsnext","title":"Quelle lecture pour la suite","url":"/fr/4.2/intro/whatsnext/"},"next":{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/4.2/topics/"},"formats":{"html":"/fr/4.2/intro/contributing/","markdown":"/fr/4.2/intro/contributing.md","json":"/fr/4.2/intro/contributing.json"},"source":"https://github.com/django/django/blob/stable/4.2.x/docs/intro/contributing.txt","official":"https://docs.djangoproject.com/fr/4.2/intro/contributing/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}