Capítulo 21
Django: views e templates
2 min de leitura 391 palavras 1 gravura
Neste capítulo você vai listar posts numa página com template seguro. O projeto-fio é o Ateliê Boa Viagem, ateliê digital fictício em Boa Viagem, Recife.
Seu ponto de partida
Use o exemplo 21-django-views do pacote anexo e copie inicio/ para uma pasta de prática fora do original. A raiz do exemplo é a referência completa desta etapa.
Use servidor só em 127.0.0.1 quando o README do exemplo pedir HTTP local. Abrir ou testar não publica nada.
Como praticar
Leia → copie ou digite → mude uma coisa → preveja → salve → recarregue → confira. Restaure cada experiência antes da próxima. Faça as atividades antes de abrir as respostas comentadas.

View lista posts
A view busca Post.objects.all() e entrega ao template.
Faça na sua cópia
Confira o trecho no contexto do exemplo antes de mudar.
def lista(request):
posts = Post.objects.all().order_by('-publicado_em')
return render(request, 'posts/lista.html', {'posts': posts})
Mude uma coisa e preveja
Ordene por título.
Anote o que espera observar antes de salvar e recarregar.
Recarregue e confira
A ordem na página muda.
Se não acontecer
Ligue a URL no urls.py.
Template com escape
{{ post.titulo }} escapa HTML por padrão. Não desligue autoescape sem necessidade.
Faça na sua cópia
Confira o trecho no contexto do exemplo antes de mudar.
{% for post in posts %}
<article><h2>{{ post.titulo }}</h2></article>
{% empty %}
<p>Nenhuma publicação ainda.</p>
{% endfor %}
Mude uma coisa e preveja
Mostre o autor no cartão.
Anote o que espera observar antes de salvar e recarregar.
Recarregue e confira
Autor aparece.
Se não acontecer
Passe o campo no contexto via modelo.
runserver em 127.0.0.1
python manage.py runserver 127.0.0.1:8000
Faça na sua cópia
Confira o trecho no contexto do exemplo antes de mudar.
python manage.py runserver 127.0.0.1:8000
Mude uma coisa e preveja
Abra a lista no navegador.
Anote o que espera observar antes de salvar e recarregar.
Recarregue e confira
Página do blog carrega.
Se não acontecer
Não use 0.0.0.0.
Atividades
Atividade 1
O que render faz?
Atividade 2
Por que o escape padrão importa?
Atividade 3
Qual host:porta o volume manda?
Respostas comentadas
Resposta da atividade 1
Junta template + contexto numa resposta HTTP.
Resposta da atividade 2
Reduz risco de XSS com dados inesperados.
Resposta da atividade 3
127.0.0.1:8000
O arquivo completo
Referência do exemplo 21-django-views, reproduzida aqui para que você possa conferir sem sair da página.
manage.py
#!/usr/bin/env python
import os, sys
def main():
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "atelie.settings")
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
if __name__ == "__main__":
main()
posts/templates/posts/lista.html
<!DOCTYPE html>
<html lang="pt-BR"><head><meta charset="utf-8"><title>Blog do Ateliê</title></head>
<body>
<h1>Blog do Ateliê Boa Viagem</h1>
{% for post in posts %}
<article><h2>{{ post.titulo }}</h2><p>{{ post.autor }}</p><p>{{ post.texto }}</p></article>
{% empty %}<p>Nenhuma publicação ainda.</p>{% endfor %}
</body></html>