quinta-feira, 15 de março de 2018

Tutorial 4 de 10

Codificando uma app simples

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 %}

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

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