Django - Visualizações Genéricas

Em alguns casos, escrever views, como vimos antes, é muito pesado. Imagine que você precisa de uma página estática ou de uma página de listagem. Django oferece uma maneira fácil de definir essas visualizações simples que são chamadas de visualizações genéricas.

Ao contrário das visualizações clássicas, as visualizações genéricas são classes, não funções. Django oferece um conjunto de classes para visões genéricas em django.views.generic, e cada visão genérica é uma dessas classes ou uma classe que herda de uma delas.

Existem mais de 10 classes 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']

Isso você pode usar para sua visão genérica. Vejamos alguns exemplos para ver como funciona.

Páginas estáticas

Vamos publicar uma página estática do modelo “static.html”.

Nosso static.html -

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

Se fizéssemos isso da maneira que aprendemos antes, teríamos que mudar o myapp/views.py ser -

from django.shortcuts import render

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

e myapp/urls.py ser -

from django.conf.urls import patterns, url

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

A melhor maneira é usar visualizações genéricas. Para isso, nosso myapp / views.py se tornará -

from django.views.generic import TemplateView

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

E nosso myapp / urls.py estaremos -

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

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

Ao acessar / myapp / static você obtém -

Para o mesmo resultado, também podemos fazer o seguinte -

  • Nenhuma mudança no views.py
  • Altere o arquivo url.py para ser -
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 você pode ver, você só precisa alterar o arquivo url.py no segundo método.

Listar e exibir dados do banco de dados

Vamos listar todas as entradas em nosso modelo Dreamreal. Isso é facilitado pelo uso da classe de exibição genérica ListView. Edite o arquivo url.py e atualize-o 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")),
)

Importante notar neste ponto é que a variável passada pela visão genérica para o template é object_list. Se você quiser dar um nome a ele, precisará adicionar um argumento context_object_name ao método as_view. Então o url.py se tornará -

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” ,)

O modelo associado será então -

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

Acessar / myapp / dreamreals / produzirá a seguinte página -