Una vista es un invocable que toma una solicitud y devuelve una respuesta. Esto puede ser más que una función, y Django proporciona un ejemplo de algunas clases que pueden usarse como vistas. Estos le permiten estructurar sus vistas y reutilizar el código aprovechando la herencia y los mixins. También hay algunas vistas genéricas para tareas que veremos más adelante, pero es posible que desee diseñar su propia estructura de vistas reutilizables que se adapte a su caso de uso. Para obtener detalles completos, consulte el documentación de referencia de vistas basadas en clases.

  • Introducción a las vistas basadas en clases
  • Vistas genéricas integradas basadas en clases
  • Manejo de formularios con vistas basadas en clases
  • Usando mixins con vistas basadas en clases

Ejemplos básicos

Django proporciona clases de vista base que se adaptarán a una amplia gama de aplicaciones. Todas las vistas heredan del View class, que se encarga de vincular la vista a las URL, el envío del método HTTP y otras características comunes. RedirectView proporciona una redirección HTTP, y TemplateView extiende la clase base para que también represente una plantilla.

Uso en su URLconf

La forma más directa de usar vistas genéricas es crearlas directamente en su URLconf. Si solo estás cambiando algunos attributes en una vista basada en clases, puede pasarlos a la as_view() método se llama a sí mismo:

from django.urls import path
from django.views.generic import TemplateView

urlpatterns = [
    path('about/', TemplateView.as_view(template_name="about.html")),
]

Cualquier argumento pasado a as_view() anulará attributes establecido en la clase. En este ejemplo, establecemos template_name sobre el TemplateView. Se puede utilizar un patrón de anulación similar para url attribute sobre RedirectView.

Subclasificación de vistas genéricas

La segunda forma más eficaz de utilizar vistas genéricas es heredar de una vista existente y anular attributes (tales como el template_name) o métodos (como get_context_data) en su subclase para proporcionar nuevos valores o métodos. Considere, por ejemplo, una vista que solo muestra una plantilla, about.html. Django tiene una vista genérica para hacer esto: TemplateView – para que podamos subclasificarlo y anular el nombre de la plantilla:

# some_app/views.py
from django.views.generic import TemplateView

class AboutView(TemplateView):
    template_name = "about.html"

Entonces necesitamos agregar esta nueva vista en nuestra URLconf. TemplateView es una clase, no una función, por lo que apuntamos la URL a la as_view() método de clase en su lugar, que proporciona una entrada similar a una función para las vistas basadas en clases:

# urls.py
from django.urls import path
from some_app.views import AboutView

urlpatterns = [
    path('about/', AboutView.as_view()),
]

Para obtener más información sobre cómo utilizar las vistas genéricas integradas, consulte el tema siguiente en vistas genéricas basadas en clases.

Compatible con otros métodos HTTP

Supongamos que alguien quiere acceder a nuestra biblioteca de libros a través de HTTP utilizando las vistas como API. El cliente API se conectaría de vez en cuando y descargaría los datos de los libros publicados desde la última visita. Pero si no aparecieron nuevos libros desde entonces, es una pérdida de tiempo de CPU y ancho de banda buscar los libros de la base de datos, generar una respuesta completa y enviarla al cliente. Puede ser preferible preguntar a la API cuándo se publicó el libro más reciente.

Asignamos la URL a la vista de lista de libros en la URLconf:

from django.urls import path
from books.views import BookListView

urlpatterns = [
    path('books/', BookListView.as_view()),
]

Y la vista:

from django.http import HttpResponse
from django.views.generic import ListView
from books.models import Book

class BookListView(ListView):
    model = Book

    def head(self, *args, **kwargs):
        last_book = self.get_queryset().latest('publication_date')
        response = HttpResponse(
            # RFC 1123 date format.
            headers='Last-Modified': last_book.publication_date.strftime('%a, %d %b %Y %H:%M:%S GMT'),
        )
        return response

Si se accede a la vista desde un GET solicitud, se devuelve una lista de objetos en la respuesta (utilizando el book_list.html plantilla). Pero si el cliente emite un HEAD solicitud, la respuesta tiene un cuerpo vacío y el Last-Modified El encabezado indica cuándo se publicó el libro más reciente. Según esta información, el cliente puede descargar o no la lista completa de objetos.