Django - Vistas genéricas

En algunos casos, escribir vistas, como hemos visto anteriormente, es realmente pesado. Imagina que necesitas una página estática o una página de listado. Django ofrece una manera fácil de configurar esas vistas simples que se denominan vistas genéricas.

A diferencia de las vistas clásicas, las vistas genéricas son clases, no funciones. Django ofrece un conjunto de clases para vistas genéricas en django.views.generic, y cada vista genérica es una de esas clases o una clase que hereda de una de ellas.

Hay más de 10 clases genéricas:

>>> import django.views.generic
>>> dir(django.views.generic)

['ArchiveIndexView', 'CreateView', 'DateDetailView', 'DayArchiveView', 
   'DeleteView', 'DetailView', 'FormView', 'GenericViewError', 'ListView', 
   'MonthArchiveView', 'RedirectView', 'TemplateView', 'TodayArchiveView', 
   'UpdateView', 'View', 'WeekArchiveView', 'YearArchiveView', '__builtins__', 
   '__doc__', '__file__', '__name__', '__package__', '__path__', 'base', 'dates', 
   'detail', 'edit', 'list']

Esto puede usarlo para su vista genérica. Veamos un ejemplo para ver cómo funciona.

Páginas estáticas

Publiquemos una página estática a partir de la plantilla "static.html".

Nuestro static.html -

<html>
   <body> 
      This is a static page!!! 
   </body>
</html>

Si hiciéramos eso de la manera que aprendimos antes, tendríamos que cambiar el myapp/views.py ser -

from django.shortcuts import render

def static(request):
   return render(request, 'static.html', {})

y myapp/urls.py ser -

from django.conf.urls import patterns, url

urlpatterns = patterns("myapp.views", url(r'^static/', 'static', name = 'static'),)

La mejor forma es utilizar vistas genéricas. Para eso, nuestro myapp / views.py se convertirá en -

from django.views.generic import TemplateView

class StaticView(TemplateView):
   template_name = "static.html"

Y nuestra myapp / urls.py estaremos -

from myapp.views import StaticView
from django.conf.urls import patterns

urlpatterns = patterns("myapp.views", (r'^static/$', StaticView.as_view()),)

Al acceder a / myapp / static obtienes -

Para obtener el mismo resultado, también podemos hacer lo siguiente:

  • Sin cambios en views.py
  • Cambie el archivo url.py para que sea -
from django.views.generic import TemplateView
from django.conf.urls import patterns, url

urlpatterns = patterns("myapp.views",
   url(r'^static/',TemplateView.as_view(template_name = 'static.html')),)

Como puede ver, solo necesita cambiar el archivo url.py en el segundo método.

Mostrar y mostrar datos de la base de datos

Vamos a enumerar todas las entradas en nuestro modelo Dreamreal. Hacerlo es fácil mediante el uso de la clase de vista genérica ListView. Edite el archivo url.py y actualícelo como -

from django.views.generic import ListView
from django.conf.urls import patterns, url

urlpatterns = patterns(
   "myapp.views", url(r'^dreamreals/', ListView.as_view(model = Dreamreal, 
      template_name = "dreamreal_list.html")),
)

Es importante tener en cuenta en este punto que la variable que pasa por la vista genérica a la plantilla es object_list. Si desea nombrarlo usted mismo, deberá agregar un argumento context_object_name al método as_view. Entonces el url.py se convertirá en -

from django.views.generic import ListView
from django.conf.urls import patterns, url

urlpatterns = patterns("myapp.views",
   url(r'^dreamreals/', ListView.as_view(
      template_name = "dreamreal_list.html")),
      model = Dreamreal, context_object_name = ”dreamreals_objects” ,)

La plantilla asociada será entonces:

{% extends "main_template.html" %}
{% block content %}
Dreamreals:<p>
{% for dr in object_list %}
{{dr.name}}</p>
{% endfor %}
{% endblock %}

Acceder a / myapp / dreamreals / producirá la siguiente página: