Iniciando com Django - Desenvolvendo com esse poderoso Framework - Parte III
by Leandro Martins on dez.27, 2008, under Django, Framework, Python
Criando uma área para consulta e visualização dos dados
Nessa última parte do tutorial vamos ver como criar uma área de consulta e visualização dos dados que foram cadastrados no admin desenvolvido nos tutoriais anteriores. O objetivo de criar essa área externa ao admin, é mostrar como o django trabalha com template e consultas no banco de dados.
Vou falar um pouco sobre sistema de template, antes de iniciar o desenvolvimento da estrutura de consulta.
O que é um template engine?
Um sistema de template é um software que é responsável por criar documentos de saída(ex: páginas html), a partir de uma junção de um modelo de layout, e dados fornecidos do banco de dados. Esse modelo de layout normalmente é feito usando o HTML/CSS para desenhar o visual do documento, que contêm instruções lógicas de como tratar os dados vindo do banco de dados. Vou citar algumas vantagens no uso de um sistema de template: reusabilidade dos modelos de layout, uma apresentação mais flexível dos dados, separação entre o de negocio de lógica e a apresentação, fácil manutenção, entre outras. Para saber mais sobre, acesse template engine.
Modelo de layout
Vamos usar como modelo de layout uma página simples, apenas para demonstrar o funcionamento. Abaixo segue seu código HTML.
index.html
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-
<meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8″ />
-
<title>titulo</title>
-
</head>
-
-
<h2>titulo</h2>
-
-
<form action=“.” method=“post”>
-
<input type=“text” id=“titulo_livro” name=“titulo_livro” size=“50″/>
-
<input type=“submit” value=“Buscar!”>
-
</form>
-
-
-
<table id=“consulta_tbl” >
-
<th>Nome do livro | </th>
-
<th>Cliente | </th>
-
<th>Aluguel data | </th>
-
<th>Entrega data | </th>
-
<th>Status do aluguel</th>
-
</tr>
-
</thead>
-
<td>livro</td>
-
<td>cliente</td>
-
<td>aluguel_data</td>
-
<td>entrega_data</td>
-
<td>status</td>
-
</tr>
-
</tbody>
-
</table>
-
</body>
-
</html>
Django template system
O django possui um sistema de template bem completo, com vários recursos, vou fazer uma pequena demonstração. Tendo o modelo de layout acima pronto, vamos fazer algumas configurações no django que são necessárias para o uso do template.
1) No arquivo settings.py de seu projeto existe um variável chamada TEMPLATE_DIRS, que tem a função de guardar o local onde estão os templates para o seu projeto, para serem carregados. Para carregar os templates automaticamente, basta indica o caminho completo que estão seus templates, no caso do tutorial:
-
TEMPLATE_DIRS = (
-
‘/home/leandro/lab/dj-app/tuto_app/tpl’,
-
)
2) Nosso próximo arquivo é o urls.py, esse arquivo é responsável por todo mapeamento de url do nosso projeto, nele vamos adicionamos a expressão de mapeamento para nossa url http://localhost:8081/consulta/ funcionar e carregar a área de consulta quando for requisitada. Para isso adicionamos importar view Consulta e colocamos no array urlpatterns, a expressão (r’^consulta/’, Consulta), como segue abaixo.
-
from django.conf.urls.defaults import *
-
from tuto_app.consulta.views import Consulta
-
-
from django.contrib import admin
-
admin.autodiscover()
-
-
urlpatterns = patterns(”,
-
(r‘^admin/(.*)’, admin.site.root),
-
(r‘^consulta/’, Consulta),
-
)
Como podemos ver nosso projeto só têm duas urls: admin e cosulta. As urlspatterns são definidas com dois parâmetros, uma expressão regular que indica o caminho e outra o view que vai ser carregado quando solicitado. Clique expressões regulares para mais informações.
3) O nosso próximo passo será incluir no template, algumas template tags, para que ele receba os dados enviado pelo view Consulta. Sendo assim vamos deixar ele parecido com a estrutura abaixo.
index.html
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-
<meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8″ />
-
<title>{{ titulo }}</title>
-
</head>
-
-
<h2>{{ titulo }}</h2>
-
-
<form action=“.” method=“post”>
-
<input type=“text” id=“titulo_livro” name=“titulo_livro” size=“50″/>
-
<input type=“submit” value=“Buscar!”>
-
</form>
-
-
-
<table id=“consulta_tbl” >
-
<th>Nome do livro | </th>
-
<th>Cliente | </th>
-
<th>Aluguel data | </th>
-
<th>Entrega data | </th>
-
<th>Status do aluguel</th>
-
</tr>
-
</thead>
-
{% ifnotequal n_registros ‘0′ %}
-
{% for dados in lista_registros %}
-
<td>{{ dados.livro }}</td>
-
<td>{{ dados.cliente }}</td>
-
<td>{{ dados.aluguel_data }}</td>
-
<td>{{ dados.entrega_data }}</td>
-
<td>{{ dados.status }}</td>
-
</tr>
-
{% endfor %}
-
</tbody>
-
{% endifnotequal %}
-
</table>
-
</body>
-
</html>
Como podemos ver, o template é composto por tags html, tags template e algumas condições lógicas e de repetições, elas têm a finalidade de mostrar o conteúdo encaminhado pela view.
View consulta
Configurado todo template, agora vamos adicionar mais aplicação ao nosso projeto, chamada Consulta. Para isso digitamos o conhecido comando:
-
$ sudo python manage.py startapp consulta
Feito isso, vamos abrir o arquivo views.py de nossa aplicação consulta e adicionar o código abaixo. O código está todo comentado para melhor entendimento.
views.py
-
#Importa a classe render_to_response, responsavel por renderizar o conteudo no template.
-
from django.shortcuts import render_to_response
-
-
#Importa a classe ObjectDoesNotExist, responsavel pela excessoes de objetos.
-
from django.core.exceptions import ObjectDoesNotExist
-
-
#Importa os models das aplicacoes.
-
from tuto_app.livros_alugado.models import LivrosAlugado
-
from tuto_app.livro.models import Livro
-
-
def Consulta(request):
-
-
#Lista por padrao os ultimos 5 livros alugados e mostra uma mensagem.
-
lista_registros = LivrosAlugado.objects.all().order_by(‘-id’,‘livro’)[:5]
-
mensagem = ‘Mostrando os ultimos 5 livros alugados.’
-
n_registros = lista_registros.count()
-
-
#Verifica se o metodo post foi enviado.
-
if request.method == ‘POST’:
-
-
try:
-
-
#Procura na tabela livro, o nome do titulo digitado.
-
livro = Livro.objects.get(titulo__icontains=request.POST[‘titulo_livro’])
-
-
#Pega o id do livro, e faz um filtro na tabela livros alugado.
-
lista_registros = LivrosAlugado.objects.filter(livro=livro.id)
-
mensagem = ‘Foram encontrados os seguintes(s) livro(s).’
-
n_registros = lista_registros.count()
-
-
#Caso ocorra alguma excessao no procedimento e mostrada a mensagem.
-
except ObjectDoesNotExist:
-
-
mensagem = ‘Nenhum resultado encontrado!’
-
n_registros = ‘0′
-
-
#Defini os dados que vao ser mostrado no template.
-
dados_template = {‘titulo’ : ‘Tutorial Django’,
-
‘mensagem’ : mensagem,
-
‘lista_registros’ : lista_registros,
-
‘n_registros’ : n_registros}
-
-
#Defini qual template vai ser receber os dados e renderizar.
-
return render_to_response(‘index.html’, dados_template)
Basicamente quando você acessar a url http://localhost:8081/consulta/, a urlpatterns vai indicar que deve ser carregado o view Consulta e executar os procedimentos contido nele e depois carrega o template index.html. Esses procedimentos são de verificação do método POST e consulta do livro na base de dados.
Testando o projeto
Para testar nosso projeto, basta acessar a url http://localhost:8081/consulta/ e você vai ver algo parecido com imagem abaixo.
Nessa tela você pode fazer consultas pelo nome do livro, e o resultado vai ser um histórico de alugueis daquele livro pesquisado.
Bom, esse pequeno tutorial é só o básico que pode ser feito com o django, o qual se mostra ser um framework para deseja desenvolver aplicações rapidamente.
Próximos passos
Comunidade nacional, Django Brasil com bastante novidades;
Documentação básica traduzida;
Tambêm existe o livro, Django Book, on-line e em inglês;
Um projeto muito legal chamado Aprendendo django no planeta Terra, elaborado pelo Marinho Brandão;
Django cheat sheet é um resumo de todos comandos utilizados no django, bem útil;
Django Snippets é um espécie de repositório de códigos django, feito por vários desenvolvedores.
Referências
http://docs.djangoproject.com/en/dev/
http://www.djangobook.com/
http://www.aprendendodjango.com/
http://www.igorsobreira.com/envolva-se-no-mundo-django/
Até a próxima!
