Foco agora: implementar interface pública.
Teremos as seguintes views:
- Página de "índice de enquetes" - exibe as enquetes mais recente.
- Página de "detalhe da questão" – exibe o texto de uma questão, sem resultados, mas com um formulário para votar.
- Página de "resultados de perguntas" - exibe os resultados de uma pergunta em particular.
- Ação de voto - gerencia a votação para uma escolha em uma enquete.
--------------------------------------------------------------------
No Django, páginas web e outros conteúdos são entregues por views. Cada view é representada por uma simples função Python(ou metodos, no caso das class-based views). O Django irá escolher uma view examinando a URL que foi requisitada (examinará a parte da URL depois do nome de domínio).
--------------------------------------------------------------------
Existem diversos padrões de URLs como “ME2/Sites/dirmod.asp?sid=&type=gen&mod=Core+Pages&gid=A6CD4967199A42D9B65B1B”. Com o Django poderemos ter padrões de URL bem mais elegantes.
Um padrão de URL é simplesmente a forma geral de uma URL,
por exemplo: /newsarchive/<year>/<month>/.
Para obter uma URL para uma view, Django usa as URLconfs. Um URLconf mapeia padrões de URL para as views.
--------------------------------------------------------------------
Codificando novas views:
Abra o arquivo votacao/views.py e codifique:
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello World. Você está no index de Votação!')
def detail(request, questao_id):
return HttpResponse("Você está olhando a questão %s." % questao_id)
def results(request, questao_id):
response = "Você está olhando os resultados da questão %s."
return HttpResponse(response % questao_id)
def vote(request, questao_id):
return HttpResponse("Você está votando na questão %s." % questao_id)
from django.urls import path
from . import views
urlpatterns = [
# ex: /votacao/
path('', views.index, name='index'),
# ex: /votacao/5/
path('<int:questao_id>/', views.detail, name='detail'),
# ex: /votacao/5/results/
path('<int:questao_id>/results/', views.results, name='results'),
# ex: /votacao/5/vote/
path('<int:questao_id>/vote/', views.vote, name='vote'),
]
--------------------------------------------------------------------
Vamos testar algumas URLs. Digite no navegador web:
localhost:8000/votacao/34/
# Você está olhando a questão 34.
localhost:8000/votacao/34/results/
# Você está olhando os resultados da questão 34.
localhost:8000/votacao/34/vote/
# Você está votando na questão 34.
--------------------------------------------------------------------
Entendendo um pouco mais sobre URLs e views:
Quando há requisição de uma página do site, exemplo 'votação/34/', o Django irá carregar o enquetes.urls (arquivo enquetes/urls.py), porque está definido no parâmetro ROOT_URLCONF em settings.py. Ele encontra a variável chamada urlpatterns em enquetes/urls.py e percorre os patterns na ordem. Após encontrar algum que encaixa com 'votação/', ele retira o texto correspondente (votação/) e envia o texto remanescente, '34/' para o URLconf 'votacao.urls' para o próximo processamento. No 'votacao.urls', procura-se por algo que se encaixa e encontra '<int:questao_id>/', e por aí, definindo a chamada de views.detail, assim:
detail(request=<HttpRequest object>, questao_id=34)
A parte 'questao_id=34' vem de '<int:questao_id>'. O uso de <> identifica parte da URL e o envia como um argumento de palavra-chave para a função da view. A parte da string ':questao_id>' define o nome que será usado para identificar o padrão que encaixa e a parte '<int:' é um conversor que determina que patterns devem se encaixar com esta parte do URL path.
Obs.: Não há necessidade de adicionar na URL algo como a extensão .HTML, a menos que deseje, algo como:
path('votacao/latest.html', views.index),
Mas não o faça, não condiz com as melhores práticas.
--------------------------------------------------------------------
Continuando:2 Responsabilidades de cada view:
1 - retornar um objeto HttpResponse contendo o conteúdo para a página requisitada, ou
2 - levantar uma exceção como Http404.
Sabendo que a view pode ler registros do banco de dados, pode usar um sistema de templates como o do Django - ou outro de terceiros, pode gerar um arquivo PDF, saída em um XML, criar um arquivo ZIP sob demanda, ou qualquer coisa que desejar, usando qualquer biblioteca Python.
Tudo que o Django espera é que a view retorne um HttpResponse. Ou uma exceção.
--------------------------------------------------------------------
Alterando o código de votacao/views.py. Abra o arquivo e codifique:
...
from .models import Questao
#VIEW INICIAL DE HELLO WORLD
#def index(request):
#NOVA VIEW INDEX
def index(request):
--------------------------------------------------------------------#VIEW INICIAL DE HELLO WORLD
#def index(request):
# return HttpResponse('Hello World. Você está no index de Votação!')
#NOVA VIEW INDEX
def index(request):
latest_questao_list = Questao.objects.order_by('-data_pub')[:5]
output = ', '.join([q.texto_questao for q in latest_questao_list])
return HttpResponse(output)
output = ', '.join([q.texto_questao for q in latest_questao_list])
return HttpResponse(output)
...
Obs.: Observe que o design da página está codificado na view. Se você quiser mudar a forma de apresentação de sua página, terá de editar este código diretamente em Python. Não é a melhor escolha. O melhor é usar um sistema de templates do Django para separar o design do código Python.
Assunto da próxima parte do tutorial.
--------------------------------------------------------------------
Nenhum comentário:
Postar um comentário