• Sistemas Web
  • Criando views

Parte 5: Criando views#

Uma view é um “tipo” de página Web em sua aplicação Django que em geral serve a uma função específica e tem um template específico. Por exemplo, em nossa aplicação de notas, nós teremos as seguintes views:

  • página de “índice” de notas - exibe todos as notas cadastradas.
  • página de detalhes da nota - apresenta o título e o texto da nota.

No Django, web pages e outros conteúdos são entregues através de views. Cada view é definida por uma função em Python (ou método, no caso de class-based views). O Django vai escolher a view ao examinar a URL que foi requisitada - para ser mais preciso, a parte da URL depois do nome do domínio.

Alterando as views e adicionando os paths#

Até o momento, o único comportamento codificado no arquivo notes/views.py é este:

from django.http import HttpResponse

def index(request):
    return HttpResponse("Olá mundo! Este é o app notes de DevLife do Insper.")

Alterando o arquivo de views

Vamos alterar o arquivo notes/views.py adicionando uma função para a página de índice e outra para a página de detalhes?

Adicione as funções abaixo no arquivo notes/views.py:

from django.http import HttpResponse
from notes.models import Note
from .models import Note

def index(request):
  notes_list = Note.objects.order_by('id')
  output = '<br> '.join([str(q) for q in notes_list])
  return HttpResponse(output)

def detail(request, note_id):
  return HttpResponse("Você está vendo a nota %s." % note_id)

Alterando o arquivo de rotas

Também não esqueça de adicionar as rotas em notes/urls.py:

from django.urls import path
from . import views

urlpatterns = [
  # ex: /notes/
  path('', views.index, name='index'),
  # ex: /notes/1/
  path('<int:note_id>/', views.detail, name='detail'),
]

Quando alguém requisita uma página do seu site Web, por exemplo “/notes/34/”, o Django irá carregar o módulo Python mysite.urls para o qual ele aponta devido a configuração em ROOT_URLCONF. Ele encontra a variável nominada urlpatterns e passa pelas descrições na mesma ordem. Depois de encontrar a combinação 'notes/', ele reparte o texto encontrado ("notes/") e envia o restante – "34/" – para o URLconf notes.urls’ para processamento posterior. Lá ele encontra '/', resultando em uma chamada para a view detail() como abaixo:

detail(request=<HttpRequest object>, note_id=34)

Cada view é responsável por fazer uma das duas coisas: devolver um objeto HttpResponse contendo o conteúdo para a página requisitada ou levantar uma exceção como Http404. O resto é com você.

Sua view pode ler registros do banco de dados, ou não. Ela pode usar um sistema de templates como o do Django ou outro sistema de templates Python de terceiros. A view pode gerar um arquivo PDF, saída em um XML, criar um arquivo ZIP sob demanda, qualquer coisa que você quiser,usando qualquer biblioteca Python que você quiser.

Importante

Tudo que o Django espera é que a view devolva um HttpResponse ou uma exceção.

O que temos até agora?#

A figura abaixo ilustra bem o que temos até o momento:

Só que esta estrutura tem um problema! A lógica da página está codificada na view. Se você quiser mudar a forma de apresentação de sua página, você terá de editar este código diretamente em Python. Para resolver isto temos que usar o sistema de templates do Django para separar a lógica da função da apresentação da página.

Siga para a próxima parte do handout para entender como trabalhar com templates.