{"title":"Vues intégrées","version":"2.0","locale":"fr","docname":"ref/views","url":"/fr/2.0/ref/views/","canonical":"https://djangodocs.dev/fr/2.0/ref/views/","summary":"Plusieurs vues intégrées de Django sont documentées dans Écriture de vues ainsi qu’à divers autres endroits de la documentation. Service des fichiers durant le…","html":"<span id=\"built-in-views\"></span><h1>Vues intégrées<a class=\"heading-anchor\" href=\"#module-django.views\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Plusieurs vues intégrées de Django sont documentées dans <a class=\"reference internal\" href=\"/fr/2.0/topics/http/views/\"><span class=\"doc\">Écriture de vues</span></a> ainsi qu’à divers autres endroits de la documentation.</p>\n<section id=\"serving-files-in-development\">\n<h2>Service des fichiers durant le développement<a class=\"heading-anchor\" href=\"#serving-files-in-development\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.static.serve\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">static.</span></span><span class=\"sig-name descname\"><span class=\"pre\">serve</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">path</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">document_root</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">show_indexes</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.static.serve\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Il est possible que vous souhaitiez que Django serve aussi d’autres fichiers que les fichiers statiques du projet lors de la phase de développement local. La vue <a class=\"reference internal\" href=\"#django.views.static.serve\" title=\"django.views.static.serve\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">serve()</span></code></a> peut être utilisée pour servir le contenu de n’importe quel répertoire. (Cette vue n’est <strong>pas</strong> suffisamment robuste pour une utilisation en production et ne devrait être utilisée que pour aider au développement ; ces fichiers devraient être servis en production par un serveur Web frontal réel.)</p>\n<p>L’exemple le plus probable concerne les fichiers téléversés par les utilisateurs dans <a class=\"reference internal\" href=\"/fr/2.0/ref/settings/#std-setting-MEDIA_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_ROOT</span></code></a>. <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.staticfiles</span></code> est prévu pour les fichiers statiques en ne comporte pas de gestion intégrée pour les fichiers téléversés par les utilisateurs, mais vous pouvez demander à Django de servir le contenu de <a class=\"reference internal\" href=\"/fr/2.0/ref/settings/#std-setting-MEDIA_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_ROOT</span></code></a> an ajoutant quelque chose comme ceci à votre configuration d’URL :</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.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</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\">re_path</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.static</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">serve</span>\n\n<span class=\"c1\"># ... the rest of your URLconf goes here ...</span>\n\n<span class=\"k\">if</span> <span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">DEBUG</span><span class=\"p\">:</span>\n    <span class=\"n\">urlpatterns</span> <span class=\"o\">+=</span> <span class=\"p\">[</span>\n        <span class=\"n\">re_path</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^media/(?P&lt;path&gt;.*)$&#39;</span><span class=\"p\">,</span> <span class=\"n\">serve</span><span class=\"p\">,</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;document_root&#39;</span><span class=\"p\">:</span> <span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">MEDIA_ROOT</span><span class=\"p\">,</span>\n        <span class=\"p\">}),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n<p>Notez que cet extrait suppose que votre réglage <a class=\"reference internal\" href=\"/fr/2.0/ref/settings/#std-setting-MEDIA_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_URL</span></code></a> contient la valeur <code class=\"docutils literal notranslate\"><span class=\"pre\">'/media/'</span></code>. Ce code appelle la vue <a class=\"reference internal\" href=\"#django.views.static.serve\" title=\"django.views.static.serve\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">serve()</span></code></a> en lui transmettant le chemin capturé par la configuration d’URL et le paramètre (obligatoire) <code class=\"docutils literal notranslate\"><span class=\"pre\">document_root</span></code>.</p>\n<p>Comme il peut vite devenir pesant de définir ce motif d’URL, Django est livré avec une petite fonction utilitaire d’URL nommée <a class=\"reference internal\" href=\"/fr/2.0/ref/urls/#django.conf.urls.static.static\" title=\"django.conf.urls.static.static\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">static()</span></code></a>, qui accepte en paramètre le préfixe (tel que <a class=\"reference internal\" href=\"/fr/2.0/ref/settings/#std-setting-MEDIA_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_URL</span></code></a>) et un chemin vers une vue en syntaxe pointée, tel que <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.views.static.serve'</span></code>. Tout autre paramètre de fonction est transmis à la vue de manière transparente.</p>\n</section>\n<section id=\"error-views\">\n<span id=\"id1\"></span><h2>Vues d’erreur<a class=\"heading-anchor\" href=\"#error-views\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django est livré avec quelques vues par défaut pour traiter les erreurs HTTP. Pour remplacer celles-ci par vos propres vues personnalisées, consultez <a class=\"reference internal\" href=\"/fr/2.0/topics/http/views/#customizing-error-views\"><span class=\"std std-ref\">Personnalisation des vues d’erreur</span></a>.</p>\n<section id=\"the-404-page-not-found-view\">\n<span id=\"http-not-found-view\"></span><h3>La vue 404 (page non trouvée)<a class=\"heading-anchor\" href=\"#the-404-page-not-found-view\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.defaults.page_not_found\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">defaults.</span></span><span class=\"sig-name descname\"><span class=\"pre\">page_not_found</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">exception</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">template_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'404.html'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.defaults.page_not_found\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Lorsque vous générez une exception <a class=\"reference internal\" href=\"/fr/2.0/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">Http404</span></code></a> à partir d’une vue, Django charge une vue spéciale consacrée au traitement des erreurs 404. Par défaut, il s’agit de la vue <a class=\"reference internal\" href=\"#django.views.defaults.page_not_found\" title=\"django.views.defaults.page_not_found\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.views.defaults.page_not_found()</span></code></a> qui produit soit un message « Non trouvé » très simple, soit charge et affiche le gabarit <code class=\"docutils literal notranslate\"><span class=\"pre\">404.html</span></code> si celui-ci existe dans le répertoire racine des gabarits.</p>\n<p>La vue 404 par défaut va passer deux variables au gabarit : <code class=\"docutils literal notranslate\"><span class=\"pre\">request_path</span></code>, qui est l’URL qui a abouti à l’erreur, et <code class=\"docutils literal notranslate\"><span class=\"pre\">exception</span></code>, qui est une représentation utile de l’exception qui a déclenché la vue (par ex. contenant un éventuel message transmis à une instance <code class=\"docutils literal notranslate\"><span class=\"pre\">Http404</span></code> spécifique).</p>\n<p>Trois éléments à signaler à propos des vues 404 :</p>\n<ul class=\"simple\">\n<li><p>La vue 404 est également appelée si Django ne trouve pas de correspondance après avoir vérifié chaque expression régulière dans la configuration d’URL.</p></li>\n<li><p>La vue 404 reçoit un objet <a class=\"reference internal\" href=\"/fr/2.0/ref/templates/api/#django.template.RequestContext\" title=\"django.template.RequestContext\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestContext</span></code></a> et peut accéder aux variables produites par les processeurs de contexte de gabarit (par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">MEDIA_URL</span></code>).</p></li>\n<li><p>Si <a class=\"reference internal\" href=\"/fr/2.0/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> est défini à <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> (dans votre module de réglages), la vue 404 ne sera jamais utilisée, mais elle est remplacée par l’affichage de la configuration d’URL ainsi que de certaines informations de débogage.</p></li>\n</ul>\n</section>\n<section id=\"the-500-server-error-view\">\n<span id=\"http-internal-server-error-view\"></span><h3>La vue 500 (erreur de serveur)<a class=\"heading-anchor\" href=\"#the-500-server-error-view\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.defaults.server_error\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">defaults.</span></span><span class=\"sig-name descname\"><span class=\"pre\">server_error</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">template_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'500.html'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.defaults.server_error\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>De la même façon, Django passe par un comportement d’exception en cas d’erreur d’exécution dans le code d’une vue. Lorsqu’une vue génère une exception, Django appelle par défaut la vue <code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.defaults.server_error</span></code>, qui produit soit un message « Erreur de serveur » très simple, soit charge et affiche le gabarit <code class=\"docutils literal notranslate\"><span class=\"pre\">500.html</span></code> si celui-ci existe au premier niveau du répertoire des gabarits.</p>\n<p>La vue 500 par défaut ne transmet aucune variable au gabarit <code class=\"docutils literal notranslate\"><span class=\"pre\">500.html</span></code>, celui-ci recevant un context <code class=\"docutils literal notranslate\"><span class=\"pre\">Context</span></code> vide pour minimiser le risque d’erreurs supplémentaires.</p>\n<p>Si <a class=\"reference internal\" href=\"/fr/2.0/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> est défini à <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> (dans votre module de réglages), la vue 500 ne sera jamais utilisée, mais elle est remplacée par l’affichage de la pile d’appels (« traceback ») ainsi que de certaines informations de débogage.</p>\n</section>\n<section id=\"the-403-http-forbidden-view\">\n<span id=\"http-forbidden-view\"></span><h3>La vue 403 (accès interdit ou « HTTP Forbidden »)<a class=\"heading-anchor\" href=\"#the-403-http-forbidden-view\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.defaults.permission_denied\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">defaults.</span></span><span class=\"sig-name descname\"><span class=\"pre\">permission_denied</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">exception</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">template_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'403.html'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.defaults.permission_denied\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Dans la même perspective que pour les vues 404 et 500, Django contient une vue pour gérer les erreurs 403 d’accès refusé. Si une vue génère une exception 403, Django appelle par défaut la vue <code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.defaults.permission_denied</span></code>.</p>\n<p>Cette vue charge et affiche le gabarit <code class=\"docutils literal notranslate\"><span class=\"pre\">403.html</span></code> se trouvant à la racine du répertoire des gabarits, ou, si ce fichier n’existe pas, affiche le texte « 403 Forbidden » comme le prescrit le <span class=\"target\" id=\"index-2\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc7231.html#section-6.5.3\"><strong>RFC 7231 Section 6.5.3</strong></a> (la spécification HTTP 1.1). Le contexte de gabarit contient <code class=\"docutils literal notranslate\"><span class=\"pre\">exception</span></code> qui est une représentation textuelle de l’expression qui a déclenché la vue.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.defaults.permission_denied</span></code> est provoquée par une exception <a class=\"reference internal\" href=\"/fr/2.0/ref/exceptions/#django.core.exceptions.PermissionDenied\" title=\"django.core.exceptions.PermissionDenied\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">PermissionDenied</span></code></a>. Pour refuser l’accès à l’une de vos vues, voici le code pouvant être utilisé :</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.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">PermissionDenied</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">edit</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">pk</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">is_staff</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"n\">PermissionDenied</span>\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n</section>\n<section id=\"the-400-bad-request-view\">\n<span id=\"http-bad-request-view\"></span><h3>La vue 400 (mauvaise requête)<a class=\"heading-anchor\" href=\"#the-400-bad-request-view\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.defaults.bad_request\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">defaults.</span></span><span class=\"sig-name descname\"><span class=\"pre\">bad_request</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">exception</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">template_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'400.html'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.defaults.bad_request\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Lorsqu’une exception <a class=\"reference internal\" href=\"/fr/2.0/ref/exceptions/#django.core.exceptions.SuspiciousOperation\" title=\"django.core.exceptions.SuspiciousOperation\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">SuspiciousOperation</span></code></a> est générée dans Django, elle peut être traitée par un composant de Django (par exemple en réinitialisant les données de session). Lorsque ce n’est pas le cas, Django considère que la requête actuelle est une « mauvaise requête », au lieu de produire une erreur de serveur.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.defaults.bad_request</span></code> est globalement très semblable à la vue <code class=\"docutils literal notranslate\"><span class=\"pre\">server_error</span></code>, mais renvoie un code de statut 400 indiquant que la condition d’erreur est le résultat d’une opération du client. Par défaut, aucun élément de l’exception qui a déclenché la vue n’est transmis au contexte du gabarit, dans la mesure où le message de l’exception pourrait contenir des informations sensibles telles que des chemins de système de fichiers.</p>\n<p>Les vues <code class=\"docutils literal notranslate\"><span class=\"pre\">bad_request</span></code> ne sont également utilisées que lorsque <a class=\"reference internal\" href=\"/fr/2.0/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n</section>\n</section>","rootId":"module-django.views","toc":[{"title":"Service des fichiers durant le développement","anchor":"serving-files-in-development","children":[]},{"title":"Vues d’erreur","anchor":"error-views","children":[{"title":"La vue 404 (page non trouvée)","anchor":"the-404-page-not-found-view","children":[]},{"title":"La vue 500 (erreur de serveur)","anchor":"the-500-server-error-view","children":[]},{"title":"La vue 403 (accès interdit ou « HTTP Forbidden »)","anchor":"the-403-http-forbidden-view","children":[]},{"title":"La vue 400 (mauvaise requête)","anchor":"the-400-bad-request-view","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/2.0/ref/"}],"prev":{"docname":"ref/validators","title":"Validateurs","url":"/fr/2.0/ref/validators/"},"next":{"docname":"misc/index","title":"Méta documentation et divers","url":"/fr/2.0/misc/"},"formats":{"html":"/fr/2.0/ref/views/","markdown":"/fr/2.0/ref/views.md","json":"/fr/2.0/ref/views.json"},"source":"https://github.com/django/django/blob/stable/2.0.x/docs/ref/views.txt","official":"https://docs.djangoproject.com/fr/2.0/ref/views/","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"]}