quarta-feira, 14 de março de 2018

Tutorial 3 de 10

Codificando uma app simples

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)

Abra o arquivo votacao/urls.py e codifique:

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):
# 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)

...
--------------------------------------------------------------------
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

Tutorial 10 de 10

Codificando uma app simples Continuando a alteração no admin... Personalizando a listagem da página de Administração: Vamos fazer melh...