Vistas base

Los textos traducidos son:

Muchas de las vistas basadas en clase incorporadas de Django heredan de otras vistas basadas en clase o de varios mixins. Dado que esta cadena de herencia es muy importante, las clases antecesoras están documentadas bajo el título de sección Ancestors (MRO). MRO es un acrónimo para Method Resolution Order.

View

class django.views.generic.base.View

La clase base de vista. Todas las otras vistas basadas en clase heredan de esta clase base. No es estrictamente una vista genérica y, por lo tanto, también puede importarse desde django.views.

Diagrama de flujo de métodos

  1. setup()

  2. dispatch()

  3. http_method_not_allowed()

  4. options()

**Ejemplo 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!")

Ejemplo urls.py:

from django.urls import path

from myapp.views import MyView

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

Atributos

http_method_names

La lista de nombres de métodos HTTP que esta vista aceptará.

Predeterminado:

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

Métodos

classmethod as_view(**initkwargs)

Devuelve una función de vista llamable que toma una solicitud y devuelve una respuesta

response = MyView.as_view()(request)

La función devuelta tiene atributos view_class y view_initkwargs.

Cuando la vista se llama durante el ciclo de solicitud/respuesta, el método setup() asigna a la vista el atributo request con la instancia de HttpRequest, y cualquier argumento posicional y/o palabra clave capturado desde el patrón de URL se asignan a los atributos args y kwargs, respectivamente. Luego se llama al método dispatch().

Si una subclase de View define manejadores de métodos asíncronos (async def), as_view() marcará la función devuelta como una función de coroutine. Se levantará una excepción ImproperlyConfigured si se definen tanto manejadores asíncronos (async def) como síncronos (def) en una sola clase de vista.

setup(request, *args, **kwargs)

Realiza la inicialización clave de la vista antes de dispatch().

Asigna el HttpRequest al atributo request de la vista, y cualquier argumento posicional y/o de palabra clave capturado desde el patrón de URL a los atributos args y kwargs, respectivamente.

Si se sobreescribe este método, debe llamarse a super().

dispatch(request, *args, **kwargs)

La parte view de la vista – el método que acepta un argumento request más argumentos y devuelve una respuesta HTTP.

La implementación por defecto inspeccionará el método HTTP y tratará de delegar en un método que coincida con el método HTTP; se delegará a get() para un GET, a post() para un POST y así sucesivamente.

Por defecto, una solicitud HEAD se delegará a get(). Si necesita manejar solicitudes HEAD de manera diferente que las solicitudes GET, puede sobreescribir el método head(). Consulte soporte para otros métodos HTTP para un ejemplo.

http_method_not_allowed(request, *args, **kwargs)

Si la vista se llamó con un método HTTP que no soporta, este método se llama en su lugar.

La implementación por defecto devuelve HttpResponseNotAllowed con una lista de métodos permitidos en texto plano.

options(request, *args, **kwargs)

Maneja las respuestas a solicitudes para el verbo HTTP OPTIONS. Devuelve una respuesta con la cabecera Allow que contiene una lista de nombres de métodos HTTP permitidos de la vista.

Si los manejadores de otros métodos HTTP en la clase son asíncronos (async def), la respuesta se envolverá en una función coroutine para su uso con await.

TemplateView

class django.views.generic.base.TemplateView

Renders a un template dado, con el contexto que contiene parámetros capturados en la URL.

Ancestros (MRO)

Esta vista hereda métodos y atributos de las siguientes vistas:

Diagrama de flujo de métodos

  1. setup()

  2. dispatch()

  3. http_method_not_allowed()

  4. get_context_data()

**Ejemplo 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

Ejemplo urls.py:

from django.urls import path

from myapp.views import HomePageView

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

Contexto

  • Poblado (a través de ContextMixin) con los argumentos de palabra clave capturados del patrón de URL que sirvió la vista.

  • Puedes agregar contexto utilizando la palabra clave de argumento extra_context para as_view().

RedirectView

class django.views.generic.base.RedirectView

Redirecciona a una URL dada.

La URL proporcionada puede contener formato de cadena estilo diccionario, que se interpolará contra los parámetros capturados en la URL. Debido a que la interpolación por palabras clave siempre se realiza (incluso si no se pasan argumentos), cualquier caracteres "%" en la URL deben escribirse como "%%" para que Python los convierta en un signo de porcentaje único en la salida.

Si la URL dada es None, Django devolverá un HttpResponseGone (410).

Ancestros (MRO)

Esta vista hereda métodos y atributos de la siguiente vista:

Diagrama de flujo de métodos

  1. setup()

  2. dispatch()

  3. http_method_not_allowed()

  4. obtener_url_de_redireccion()

**Ejemplo 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)

Ejemplo 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",
    ),
]

Atributos

url

La URL a la que redirigir, como una cadena de caracteres. O None para levantar un error HTTP 410 (Gone).

pattern_name

El nombre del patrón de URL para redireccionar a él. Se realizará la reversión utilizando los mismos args y kwargs que se pasan en este vista.

permanent

Si el redireccionamiento debe ser permanente. La única diferencia aquí es el código de estado HTTP devuelto. Si True, entonces el redireccionamiento utilizará el código de estado 301. Si False, entonces el redireccionamiento utilizará el código de estado 302. Por defecto, permanent es False.

query_string

Si se deben pasar los parámetros GET a la nueva ubicación. Si True, entonces los parámetros GET se agregan al URL. Si False, entonces los parámetros GET se descartan. Por defecto, query_string es False.

Métodos

get_redirect_url(*args, **kwargs)

Construye la URL objetivo para la redirección.

Los argumentos args y kwargs son argumentos posicionales y/o de palabra clave capturados del patrón de URL, respectivamente.

La implementación predeterminada utiliza url como cadena inicial y realiza la expansión de los parámetros nombrados % en esa cadena utilizando los grupos capturados en el URL.

Si no se establece url, get_redirect_url() intenta revertir el pattern_name utilizando lo que se capturó en el URL (se utilizan tanto grupos nombrados como anónimos).

Si se solicita por query_string, también agregará los parámetros GET a la URL generada. Las subclases pueden implementar cualquier comportamiento que deseen, siempre y cuando el método devuelva una cadena de URL lista para redireccionar.