Dados dinâmicos em templates
Até o momento, temos diferentes peças: o modelo Post
está definido em models.py
, temos post_list
em views.py
e o template adicionado. Mas como faremos de fato para que as postagens apareçam no nosso template em HTML? Porque é isso que nós queremos: pegar algum conteúdo (modelos salvos no banco de dados) e exibi-lo de uma maneira bacana no nosso template, certo?
E isso é exatamente o que as views devem fazer: conectar modelos e templates. Vamos precisar pegar os modelos que queremos exibir e passá-los para o template na nossa lista de postagens post_list
view. Em uma view, nós decidimos o que (qual modelo) será exibido em um template.
Tudo bem, e como vamos fazer isso?
Precisamos abrir o nosso blog/views.py
. Até agora, a view post_list
se parece com isso:
blog/views.py
from django.shortcuts import render
def post_list(request):
return render(request, 'blog/post_list.html', {})
Lembra de quando falamos sobre a inclusão de código que foi escrito em arquivos diferentes? Agora é o momento em que precisamos que incluir o modelo que temos escrito em models.py
. Vamos adicionar a linha from .models import Post
assim:
blog/views.py
from django.shortcuts import render
from .models import Post
O ponto antes de models
significa diretório atual ou aplicativo atual. Tanto views.py
como models.py
estão no mesmo diretório. Isto significa que podemos usar .
e o nome do arquivo (sem py
). Em seguida, importamos o nome do modelo (Post
).
E o que vem agora? Para pegar os posts reais do modelo Post
, precisamos de uma coisa chamada QuerySet
.
QuerySet
Você já deve estar familiarizada com o modo que os QuerySets funcionam. Nós conversamos sobre isso no capítulo QuerySets e ORM do Django.</p>
Agora queremos classificar as postagens publicadas por published_date
, certo? Nós já fizemos isso no capítulo sobre QuerySets!
blog/views.py
Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
Agora vamos colocar esse pedaço de código dentro do arquivo blog.views.py
adicionando-o à função def post_list(request)
. Não esqueça de adicionar from django.utils import timezone
antes!
blog/views.py
from django.shortcuts import render
from django.utils import timezone
from .models import Post
def post_list(request):
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
return render(request, 'blog/post_list.html', {})
A última parte que falta é passar a QuerySet posts
para o template. Não se preocupe com isso agora, vamos falar sobre como exibi-lo em um próximo capítulo.
Note que criamos uma variável para nosso o QuerySet: posts
. Esse é o nome do nosso QuerySet. De agora em diante, podemos nos referir a ele por este nome.
Na função render
já temos um parâmetro request
(tudo o que recebemos do usuário através da Internet) e um arquivo de template ('blog/post_list.html'
). O último parâmetro -- {}
-- é um lugar em que podemos acrescentar algumas coisas para o template usar. Precisamos nomear os parâmetros (continuaremos com 'posts'
, por enquanto). :) Deve ficar assim: {'posts': posts}
. Note que a parte antes de :
é uma string; por isso você precisa colocá-la entre aspas: "
.
Agora, nosso arquivo blog/views.py
deve ter essa cara:
blog/views.py
from django.shortcuts import render
from django.utils import timezone
from .models import Post
def post_list(request):
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
return render(request, 'blog/post_list.html', {'posts': posts})
Pronto! Hora de voltar para o nosso template e exibir essa QuerySet!
Se quiser ler mais sobre QuerySets no Django, você deve dar uma olhada aqui: https://docs.djangoproject.com/en/2.0/ref/models/querysets/