# Documentation Django 6.0.7

# Vues de base

Les trois classes suivantes fournissent la plupart des fonctionnalités nécessaires à la création de vues Django. Vous pouvez les considérer comme des vues parentes qui peuvent être utilisées telles quelles ou comme classe parente. Elles ne contiennent pas toutes les fonctionnalités requises par les projets, c’est pour cela qu’il y a des vues basées sur des classes de type `Mixin` et d’autres génériques.

La plupart des vues fondées sur les classes intégrées à Django héritent d’autres vues fondées sur les classes ou de différentes classes mixin. En raison de l’importance de cette chaîne d’héritage, les classes parentes sont documentées sous la section Ancêtres (MRO). MRO est un acronyme pour Method Resolution Order (ordre de résolution des méthodes).

## `View`

class django.views.generic.base.View

  La classe de vue de base. Toutes les autres héritent de cette classe de base. Il ne s’agit pas strictement d’une vue générique et elle peut donc être importée à partir de `django.views`.

  Index des méthodes

  1. `setup()`

  2. `dispatch()`

  3. `http_method_not_allowed()`

  4. `options()`

  Exemple de fichier views.py:

      from django.http import HttpResponse
      from django.views import View

      class MyView(View):
          def get(self, request, *args, **kwargs):
              return HttpResponse("Hello, World!")

  Exemple de fichier urls.py:

      from django.urls import path

      from myapp.views import MyView

      urlpatterns = [
          path("mine/", MyView.as_view(), name="my-view"),
      ]

  Attributs

  http_method_names

    La liste des noms de méthodes HTTP que cette vue accepte.

    Valeur par défaut :

        ["get", "post", "put", "patch", "delete", "head", "options", "trace"]

  Méthodes

  classmethod as_view(**initkwargs)

    Renvoie une vue exécutable acceptant une requête et renvoyant une réponse :

        response = MyView.as_view()(request)

    La vue renvoyée possède les attributs `view_class` et `view_initkwargs`.

    Lorsque la vue est appelée pendant le cycle requête/réponse, la méthode `setup()` définit l’attribut `request` de la vue à l’objet `HttpRequest`, ainsi que tout paramètre positionnel ou nommé capturé à partir du motif d’URL aux attributs `args` et `kwargs` de la vue. Puis, `dispatch()` est appelée.

    Si une sous-classe de `View` définit des gestionnaires de méthodes asynchrones (`async def`), `as_view()` marquera la fonction renvoyée comme fonction coroutine. Une exception `ImproperlyConfigured` sera produite si des gestionnaires de la même classe de vue sont définis à la fois comme asynchrone (`async def`) et synchrone (`def`).

  setup(request, *args, **kwargs)

    Effectue l’initialisation des variables principales de la vue avant `dispatch()`.

    Définit l’attribut `request` de la vue à l’objet `HttpRequest`, ainsi que tout paramètre positionnel ou nommé capturé à partir du motif d’URL aux attributs `args` et `kwargs` de la vue.

    Si vous surchargez cette méthode, n’oubliez pas d’appeler `super()`.

  dispatch(request, *args, **kwargs)

    La partie `view` de la vue, la méthode qui accepte un paramètre `request` ainsi que d’autres paramètres et qui renvoie une réponse HTTP.

    L’implémentation par défaut examine la méthode HTTP et essaie de déléguer l’exécution à une méthode qui correspond à la méthode HTTP ; une requête `GET` sera déléguée à `get()`, une requête `POST` à `post()`, et ainsi de suite.

    Par défaut, une requête `HEAD` sera déléguée à `get()`. Si vous avez besoin de traiter différemment les requêtes `HEAD`, vous pouvez surcharger la méthode `head()`. Voir l’exemple dans Prise en charge de méthodes HTTP alternatives.

  http_method_not_allowed(request, *args, **kwargs)

    Si la vue a été appelée par une méthode HTTP qu’elle ne prend pas en charge, c’est cette méthode qui sera appelée.

    The default implementation returns `HttpResponseNotAllowed` with the list of allowed methods in the `Allow` header, as required by RFC 7231. The response body is empty.

  options(request, *args, **kwargs)

    Traite la réponse aux requêtes du verbe HTTP OPTIONS. Renvoie une réponse avec l’en-tête `Allow` contenant une liste des noms de méthodes HTTP autorisées pour la vue.

    SI les autres gestionnaires de méthode HTTP de la classe sont asynchrones (`async def`), la réponse sera enveloppée dans une fonction coroutine utilisable avec `await`.

## `TemplateView`

class django.views.generic.base.TemplateView

  Effectue le rendu d’un gabarit donné, avec le contexte contenant les paramètres capturés dans l’URL.

  Ancêtres (MRO)

  Cette vue hérite des méthodes et des attributs des vues suivantes :

  - `django.views.generic.base.TemplateResponseMixin`

  - `django.views.generic.base.ContextMixin`

  - `django.views.generic.base.View`

  Index des méthodes

  1. `setup()`

  2. `dispatch()`

  3. `http_method_not_allowed()`

  4. `get_context_data()`

  Exemple de fichier views.py:

      from django.views.generic.base import TemplateView

      from articles.models import Article

      class HomePageView(TemplateView):
          template_name = "home.html"

          def get_context_data(self, **kwargs):
              context = super().get_context_data(**kwargs)
              context["latest_articles"] = Article.objects.all()[:5]
              return context

  Exemple de fichier urls.py:

      from django.urls import path

      from myapp.views import HomePageView

      urlpatterns = [
          path("", HomePageView.as_view(), name="home"),
      ]

  Contexte

  - Complété (via `ContextMixin`) par les paramètres nommés capturés par le motif d’URL qui a servi à appeler la vue.

  - Il est aussi possible d’ajouter du contexte en utilisant le paramètre nommé `extra_context` de `as_view()`.

## `RedirectView`

class django.views.generic.base.RedirectView

  Redirection vers l’URL donnée.

  L’URL donnée peut contenir des chaînes de format de type dictionnaire, qui seront interpolées par les paramètres capturés dans l’URL. Comme l’interpolation par mot-clé a toujours lieu (même si aucun paramètre n’est capturé), tout caractère `"%"` dans l’URL doit être doublé (`"%%"`) de sorte que Python convertit ces séquences en caractère pourcent unique lors de l’affichage.

  Si l’URL indiquée vaut `None`, Django renvoie une réponse `HttpResponseGone` (410).

  Ancêtres (MRO)

  Cette vue hérite des méthodes et des attributs de la vue suivante :

  - `django.views.generic.base.View`

  Index des méthodes

  1. `setup()`

  2. `dispatch()`

  3. `http_method_not_allowed()`

  4. `get_redirect_url()`

  Exemple de fichier views.py:

      from django.shortcuts import get_object_or_404
      from django.views.generic.base import RedirectView

      from articles.models import Article

      class ArticleCounterRedirectView(RedirectView):
          permanent = False
          query_string = True
          pattern_name = "article-detail"

          def get_redirect_url(self, *args, **kwargs):
              article = get_object_or_404(Article, pk=kwargs["pk"])
              article.update_counter()
              return super().get_redirect_url(*args, **kwargs)

  Exemple de fichier urls.py:

      from django.urls import path
      from django.views.generic.base import RedirectView

      from article.views import ArticleCounterRedirectView, ArticleDetailView

      urlpatterns = [
          path(
              "counter/<int:pk>/",
              ArticleCounterRedirectView.as_view(),
              name="article-counter",
          ),
          path("details/<int:pk>/", ArticleDetailView.as_view(), name="article-detail"),
          path(
              "go-to-django/",
              RedirectView.as_view(url="https://www.djangoproject.com/"),
              name="go-to-django",
          ),
      ]

  Attributs

  url

    L’URL vers laquelle rediriger, sous forme textuelle. Ou `None` pour générer une erreur HTTP 410 (Gone).

  pattern_name

    Le nom du motif d’URL vers lequel rediriger. La résolution inverse est effectuée à l’aide des mêmes paramètres positionnels et nommés (args/kwargs) que ceux transmis à cette vue.

  permanent

    Indique si la redirection doit être permanente. La seule différence est le code de statut HTTP qui est renvoyé. Si `True`, la redirection produit un code de statut 301. Si `False`, la redirection produit un code de statut 302. Par défaut, `permanent` vaut `False`.

  query_string

    Indique s’il faut transférer la chaîne de requête GET vers le nouvel emplacement. Si `True`, la chaîne de requête est ajoutée à l’URL. Si `False`, la chaîne de requête n’est pas considérée. Par défaut, `query_string` vaut `False`.

  preserve_request
    New in Django 6.1.

    Whether to preserve the HTTP method and body during the redirect. If `True`, then the redirect will use status code 307 instead of 302, or 308 instead of 301 when `permanent` is `True`. By default, `preserve_request` is `False`.

  Méthodes

  get_redirect_url(*args, **kwargs)

    Construit l’URL cible de la redirection.

    Les paramètres `args` et `kwargs` sont respectivement les paramètres positionnels et nommés capturés à partir du motif d’URL.

    L’implémentation par défaut utilise `url` comme chaîne de départ et effectue la substitution des paramètres nommés `%` dans cette chaîne en utilisant les groupes nommés capturés dans l’URL.

    Si `url` n’est pas défini, `get_redirect_url()` essaie de résoudre `pattern_name` en utilisant les éléments capturés dans l’URL (aussi bien les groupes nommés qu’anonymes).

    Si la requête contenait une chaîne de paramètres `query_string`, celle-ci est aussi ajoutée à l’URL générée. Les sous-classes peuvent implémenter le comportement qu’elles souhaitent pour autant que la méthode renvoie une chaîne d’URL prête pour la redirection.