{"title":"Vues fondées sur les classes","version":"3.0","locale":"fr","docname":"topics/class-based-views/index","url":"/fr/3.0/topics/class-based-views/","canonical":"https://djangodocs.dev/fr/3.0/topics/class-based-views/","summary":"Une vue est un exécutable acceptant une requête et renvoyant une réponse. Ce n’est pas forcément une simple fonction et Django fournit des exemples de classes qui…","html":"<h1>Vues fondées sur les classes<a class=\"heading-anchor\" href=\"#class-based-views\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Une vue est un exécutable acceptant une requête et renvoyant une réponse. Ce n’est pas forcément une simple fonction et Django fournit des exemples de classes qui peuvent être utilisées comme des vues. Celles-ci vous permettent de structurer vos vues et de réutiliser du code en exploitant l’héritage et les « mixins ». Il existe également des vues génériques pour certaines tâches (nous y reviendrons plus tard), mais vous pouvez tout à fait concevoir votre propre structure de vues réutilisables en fonction de votre cas d’utilisation. Pour des détails plus complets, consultez la <a class=\"reference internal\" href=\"/fr/3.0/ref/class-based-views/\"><span class=\"doc\">documentation de référence des vues fondées sur les classes</span></a>.</p>\n<div class=\"toctree-wrapper compound\">\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/fr/3.0/topics/class-based-views/intro/\">Introduction aux vues fondées sur les classes</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/fr/3.0/topics/class-based-views/generic-display/\">Vues génériques fondées sur les classes, fournies par Django</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/fr/3.0/topics/class-based-views/generic-editing/\">Gestion de formulaires avec les vues fondées sur les classes</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/fr/3.0/topics/class-based-views/mixins/\">Utilisation de mixins avec les vues fondées sur les classes</a></li>\n</ul>\n</div>\n<section id=\"basic-examples\">\n<h2>Exemples de base<a class=\"heading-anchor\" href=\"#basic-examples\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django fournit des classes de vues basiques qui conviennent à une large palette d’applications. Toutes ces vues héritent de la classe <a class=\"reference internal\" href=\"/fr/3.0/ref/class-based-views/base/#django.views.generic.base.View\" title=\"django.views.generic.base.View\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">View</span></code></a>, qui gère la liaison de la vue aux URL, la distribution en fonction de la méthode HTTP et d’autres fonctionnalités de base. <a class=\"reference internal\" href=\"/fr/3.0/ref/class-based-views/base/#django.views.generic.base.RedirectView\" title=\"django.views.generic.base.RedirectView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RedirectView</span></code></a> sert pour les redirections HTTP alors que <a class=\"reference internal\" href=\"/fr/3.0/ref/class-based-views/base/#django.views.generic.base.TemplateView\" title=\"django.views.generic.base.TemplateView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateView</span></code></a> étend la classe de base afin d’être capable d’afficher un gabarit.</p>\n</section>\n<section id=\"usage-in-your-urlconf\">\n<h2>Utilisation dans une configuration d’URL<a class=\"heading-anchor\" href=\"#usage-in-your-urlconf\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>La manière la plus directe d’utiliser des vues génériques est de les créer directement dans votre configuration d’URL. Si vous ne devez changer qu’un nombre restreint d’attributs d’une vue fondée sur une classe, vous pouvez les transmettre directement dans l’appel de méthode <a class=\"reference internal\" href=\"/fr/3.0/ref/class-based-views/base/#django.views.generic.base.View.as_view\" title=\"django.views.generic.base.View.as_view\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_view()</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"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<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TemplateView</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;about/&#39;</span><span class=\"p\">,</span> <span class=\"n\">TemplateView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(</span><span class=\"n\">template_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;about.html&quot;</span><span class=\"p\">)),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Tout paramètre transmis à <a class=\"reference internal\" href=\"/fr/3.0/ref/class-based-views/base/#django.views.generic.base.View.as_view\" title=\"django.views.generic.base.View.as_view\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_view()</span></code></a> surcharge l’attribut de même nom de la classe. Dans cet exemple, nous définissons <code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code> de la vue <code class=\"docutils literal notranslate\"><span class=\"pre\">TemplateView</span></code>. Le même système de surcharge peut être utilisé pour l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">url</span></code> de <a class=\"reference internal\" href=\"/fr/3.0/ref/class-based-views/base/#django.views.generic.base.RedirectView\" title=\"django.views.generic.base.RedirectView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RedirectView</span></code></a>.</p>\n</section>\n<section id=\"subclassing-generic-views\">\n<h2>Héritage des vues génériques<a class=\"heading-anchor\" href=\"#subclassing-generic-views\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>L’autre façon, plus puissante, d’utiliser les vues génériques est d’hériter d’une vue existante et de surcharger ses attributs (comme <code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code>) ou ses méthodes (comme <code class=\"docutils literal notranslate\"><span class=\"pre\">get_context_data</span></code>) dans votre sous-classe pour fournir d’autres valeurs ou méthodes. Considérez par exemple une vue qui ne fait qu’afficher un gabarit, <code class=\"docutils literal notranslate\"><span class=\"pre\">about.html</span></code>. Django possède une vue générique pour faire cela, <a class=\"reference internal\" href=\"/fr/3.0/ref/class-based-views/base/#django.views.generic.base.TemplateView\" title=\"django.views.generic.base.TemplateView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateView</span></code></a>, on peut donc en hériter et surcharger la variable du nom du gabarit :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># some_app/views.py</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TemplateView</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AboutView</span><span class=\"p\">(</span><span class=\"n\">TemplateView</span><span class=\"p\">):</span>\n    <span class=\"n\">template_name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;about.html&quot;</span>\n</code></pre></div>\n<p>Puis, il faut ajouter cette nouvelle vue dans la configuration d’URL. Comme <a class=\"reference internal\" href=\"/fr/3.0/ref/class-based-views/base/#django.views.generic.base.TemplateView\" title=\"django.views.generic.base.TemplateView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateView</span></code></a> est une classe, pas une fonction, il est nécessaire de faire correspondre l’URL avec la méthode de classe <a class=\"reference internal\" href=\"/fr/3.0/ref/class-based-views/base/#django.views.generic.base.View.as_view\" title=\"django.views.generic.base.View.as_view\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_view()</span></code></a> qui constitue un point d’entrée de type fonction pour les vues fondées sur les classes :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># urls.py</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\">path</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">some_app.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">AboutView</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;about/&#39;</span><span class=\"p\">,</span> <span class=\"n\">AboutView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">()),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Pour plus d’informations sur la façon d’utiliser les vues génériques intégrées dans Django, consultez le prochain thème sur les <a class=\"reference internal\" href=\"/fr/3.0/topics/class-based-views/generic-display/\"><span class=\"doc\">vues génériques fondées sur les classes</span></a>.</p>\n<section id=\"supporting-other-http-methods\">\n<span id=\"id1\"></span><h3>Prise en charge de méthodes HTTP alternatives<a class=\"heading-anchor\" href=\"#supporting-other-http-methods\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Supposons que quelqu’un veuille accéder à notre bibliothèque de livres par HTTP en utilisant les vues comme API. Le client de cette API se connecte de temps à autre et télécharge les données des livres publiés depuis sa dernière visite. Mais si aucune publication n’a eu lieu dans l’intervalle, ce serait une perte de temps processeur et de bande passante que de récupérer les livres de la base de données, de produire une réponse complète et de l’envoyer au client. Il pourrait être préférable d’interroger l’API au sujet de la date de publication la plus récente.</p>\n<p>Nous faisons correspondre l’URL à la vue de la liste des livres dans la 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.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">path</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">books.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BookListView</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;books/&#39;</span><span class=\"p\">,</span> <span class=\"n\">BookListView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">()),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Et la vue :</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.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ListView</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">books.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Book</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BookListView</span><span class=\"p\">(</span><span class=\"n\">ListView</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Book</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">head</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">last_book</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">latest</span><span class=\"p\">(</span><span class=\"s1\">&#39;publication_date&#39;</span><span class=\"p\">)</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">HttpResponse</span><span class=\"p\">()</span>\n        <span class=\"c1\"># RFC 1123 date format</span>\n        <span class=\"n\">response</span><span class=\"p\">[</span><span class=\"s1\">&#39;Last-Modified&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">last_book</span><span class=\"o\">.</span><span class=\"n\">publication_date</span><span class=\"o\">.</span><span class=\"n\">strftime</span><span class=\"p\">(</span><span class=\"s1\">&#39;</span><span class=\"si\">%a</span><span class=\"s1\">, </span><span class=\"si\">%d</span><span class=\"s1\"> %b %Y %H:%M:%S GMT&#39;</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n<p>Si on accède à la vue par une requête <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code>, une liste d’objets est renvoyée dans la réponse (en utilisant le gabarit <code class=\"docutils literal notranslate\"><span class=\"pre\">book_list.html</span></code>). Mais si le client lance une requête <code class=\"docutils literal notranslate\"><span class=\"pre\">HEAD</span></code>, le corps de la réponse sera vide et l’en-tête <code class=\"docutils literal notranslate\"><span class=\"pre\">Last-Modified</span></code> indiquera la date de publication de livre la plus récente. Sur la base de cette information, le client peut décider de charger ou non la liste complète des objets.</p>\n</section>\n</section>","rootId":"class-based-views","toc":[{"title":"Exemples de base","anchor":"basic-examples","children":[]},{"title":"Utilisation dans une configuration d’URL","anchor":"usage-in-your-urlconf","children":[]},{"title":"Héritage des vues génériques","anchor":"subclassing-generic-views","children":[{"title":"Prise en charge de méthodes HTTP alternatives","anchor":"supporting-other-http-methods","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/3.0/topics/"}],"prev":{"docname":"topics/templates","title":"Gabarits","url":"/fr/3.0/topics/templates/"},"next":{"docname":"topics/class-based-views/intro","title":"Introduction aux vues fondées sur les classes","url":"/fr/3.0/topics/class-based-views/intro/"},"formats":{"html":"/fr/3.0/topics/class-based-views/","markdown":"/fr/3.0/topics/class-based-views.md","json":"/fr/3.0/topics/class-based-views.json"},"source":"https://github.com/django/django/blob/stable/3.0.x/docs/topics/class-based-views/index.txt","official":"https://docs.djangoproject.com/fr/3.0/topics/class-based-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"]}