Foco: uso do sistema de templates do Django, objetivo de separar o design do código Python.
Inicialmente, crie um diretório 'templates', dentro do diretório votacao. É onde o Django procura suas templates.
Dentro deste diretório, crie um diretório 'votacao'; depois crie um arquivo index.html dentro deste último diretório. Desta forma, o template estará em:
votacao/templates/votacao/index.html
--------------------------------------------------------------------
Por convenção DjangoTemplates procura por um subdiretório 'templates' em cada uma das INSTALLED_APPS.
Devido a forma como o carregador de templates app_directories funciona, você pode referenciar este template dentro do Django simplesmente como votacao/index.html.
--------------------------------------------------------------------
Namespacing de template:
Agora nós podemos ser capazes de avançar com a colocação dos nossos modelos diretamente em votacao/templates (em vez de criar outro subdiretório votacao), mas na verdade seria uma má ideia. Django irá escolher o 1º template que encontra cujo nome corresponde, e se você tivesse um template com o mesmo nome em uma aplicação diferente, O Django é incapaz de distinguir entre eles. Precisamos ser capazes de apontar Django no caminho certo, e a maneira mais fácil de garantir isso é usar namespacing. Ou seja, colocando esses templates dentro de outro diretório nomeado para a aplicação em si..
--------------------------------------------------------------------
Codificando:
Insira o código abaixo no arquivo index.html:
(votacao/templates/votacao/index.html)
{% if latest_questao_list %}
<ul>
{% for questao in latest_questao_list %}
<li><a href="/votacao/{{ questao.id }}/">{{ questao.texto_questao }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>Nenhuma votacao está disponível.</p>
{% endif %}
Insira o código abaixo no arquivo index.html:
(votacao/templates/votacao/index.html)
{% if latest_questao_list %}
<ul>
{% for questao in latest_questao_list %}
<li><a href="/votacao/{{ questao.id }}/">{{ questao.texto_questao }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>Nenhuma votacao está disponível.</p>
{% endif %}
Agora, codifique votacao/views.py para usar o template:
...
from django.template import loader
def index(request):
latest_questao_list = Questao.objects.order_by('-data_pub')[:5]
template = loader.get_template('votacao/index.html')
context = {
'latest_questao_list': latest_questao_list,
}
return HttpResponse(template.render(context, request))
...
Esse código carrega o template chamado votacao/index.html e passa um contexto para ele. O contexto é um dicionário mapeando nomes de variáveis para objetos Python.
Carregue a página apontando seu navegador para '/votacao/', e você deve ver uma lista contendo as questões. O link aponta para página de detalhes das perguntas.
--------------------------------------------------------------------
O que fizemos: carregar um template, preenchê-lo com um contexto e retornar um objeto HttpResponse com o resultado do template renderizado.
Mas o Django fornece este atalho.
Vamos codificar a index de votacao/views.py:
...
from django.shortcuts import render
def index(request):
latest_questao_list = Questao.objects.order_by('-data_pub')[:5]
context = {'latest_questao_list': latest_questao_list}
return render(request, 'votacao/index.html', context)
...
A função render() recebe o nome do template como 1º argumento e um dicionário opcional como 2ª argumento. Ele retorna um objeto HttpResponse do template informado renderizado com o contexto determinado.
Uma vez que tiver feito isto em todas as views, não mais precisa importar loader e HttpResponse. O resultado na tela é o mesmo.
--------------------------------------------------------------------
Nenhum comentário:
Postar um comentário