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: