GustavoHenrique.net

  • About
  • Contact
  • RSS Feed
  • Twitter

 

11
Nov

Django com MySQL, JQuery, Ajax e JSON – Parte 1

By gustavohenrique|Django|13 Comments

Implementando Ajax usando JSON

Ajax é uma tecnologia que utiliza Javascript para enviar e receber dados à um servidor sem precisar atualizar a página em exibição no navegador, e JSON é um formato para troca de dados, onde os dados enviados são semelhantes à uma tupla, contendo uma chave e um valor. Pode-se utilizar ajax com outros formatos para troca de dados, mas vamos ficar com o JSON por ser mais simples de se trabalhar.
Primeiro vamos escrever nossa função javascript responsável por requisitar ao servidor as ruas cadastradas a partir do id do bairro fornecido, dentro do arquivo sigep.js. É uma função genérica que pode ser utilizada com outros elementos e outras tabelas. Lembrando que é extremamente necessário carregar a biblioteca JQuery no código do template antes de usar a função abaixo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
 * @param string url - URL que processara a requisicao do cliente
 * @param string objHtmlReturn - ID do objeto HTML onde sera exibido o resultado
 * @param int id - Valor enviado como base para obter um retorno
 */
function comboAjax(url,objHtmlReturn,id)
{
  // Cria uma variável dados em formato JSON, com 1 chave e 1 valor
  dados = {'id':id};
 
  // É inserido um elemento option dentro do elemento select
  $("#"+objHtmlReturn).html('<option value="0">Carregando...</option>');
  $.ajax({
      type: "POST",
      url: url,
      dataType: "json",
      data: dados,
      success: function(retorno){
          $("#"+objHtmlReturn).empty();
          $.each(retorno, function(i, item){
              $("#"+objHtmlReturn).append('<option value="'+item.pk+'">'+item.fields[fieldreturn]+'</option>');
 
          });
      },
      error: function(erro) {
        alert('Erro. Sem retorno da requisicao.');
      }
  });
}

Modificaremos o elemento select dentro do template clienteform.html de modo a usar a função acima. Atualmente está declarado assim:

1
2
3
4
5
<select name="bairro" id="id_bairro">
  {% for b in bairros %}
    <option value="{{b.id}}">{{b.bairro}}</option>
  {% endfor %}
</select>

Alterando para incluir o evento onchange():

1
2
3
4
5
<select name="bairro" id="id_bairro" onchange="comboAjax('/cliente/getlogradouros/','id_logradouro',this.value);">
  {% for b in bairros %}
    <option value="{{b.id}}">{{b.bairro}}</option>
  {% endfor %}
</select>

Quando for selecionado um bairro, será disparado o evento onchange(), chamando a função comboAjax(), que enviará uma requisição à view /cliente/getlogradouros, que por sua vez fará uma consulta ao banco de dados retornando todos os logradouros a partir do id do bairro fornecido e exibindo o resultado no elemento select com id='id_logradouro'.
Vamos escrever a view responsável por tratar nossa requisição ajax. No arquivo views.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.core import serializers
from django.utils import simplejson
 
def getlogradouros(request):
  if request.method == 'POST':
    id = request.POST.get('id');
    lista = Logradouro.objects.filter(bairro=id)
    if lista.count() > 0:
      json = serializers.serialize("json",lista)
    else:
      lista = [{"pk":"0","fields":{'logradouro':"Nenhum registro"}}]
      json = simplejson.dumps(lista)
    return HttpResponse(json,mimetype="application/json")
getlogradouros = login_required(getlogradouros)

E para finalizar, vamos mapear a URL alterando o urlpatterns no arquivo urls.py:

1
(r'^cliente/getlogradouros/$','sigep.cliente.views.getlogradouros'),

Conclusão

Esse artigo não visa discutir assuntos relacionados à engenharia de software, modelagem de dados e orientação à objetos. Nada disso foi analisado no processo de desenvolvimento visto que foge do objetivo de ser apenas uma apresentação rápida sobre o framework. Django possui recursos fantásticos e tem tudo para estar entre os grandes.
Desenvolvemos uma aplicação simples para cadastro de clientes, com uma interface horrível e um bug ao tentar editar os dados do cliente. A questão da interface pode ser resolvida com uso de css e javascript, e quanto ao bug vou deixar como exercício para vocês tentarem resolver. O bug aparece quando tentamos editar o cliente – não mostra o endereço. O correto seria exibir todos os bairros e logradouros cadastrados e aparecer selecionados àqueles que compõem o endereço do cliente.
Em breve estarei disponibilizando mais artigos de modo a completar o sistema.
Dúvidas e sugestões serão bem-vindas.

Bookmark It

Add to Del.icio.us Add to Diigo Add to Facebook Add to Google Bookmarks Add to LinkedIn Add to Mister Wong Add to Twitter Add to Yahoo My Web
View More Pages: ←
Tagged as: ajax, Django, jquery, json, mysql, python
Add your comment →

13 Comments

  1. Muito legal o tuto, parabéns!!

    Hugs!!

    By: Relsi Reply →
    November 11, 2008 at 6:20 pm
  2. Muito bom, dei só uma olhada mas com esse tipo de material o Django ira crescer cada vez mais.

    By: Abaster Reply →
    November 11, 2008 at 7:20 pm
  3. Fala rapaz parabens ai ficou muito bom ,,
    uma abraço

    By: Rânielli The head Reply →
    November 11, 2008 at 11:58 pm
  4. Gustavo,

    Meus sinceros parabéns pelo material, está excelente.

    Um desafio:
    – O que tu achas de fazer uma versão desse ajax com a biblioteca mootools ?

    By: Leandro Reply →
    November 13, 2008 at 2:21 pm
  5. Parabéns Gustavo,

    Ouvi falar da eficiência do Django a poucos dias e procurei algo simples que pudesse me comprovar isso…
    Vc sintetizou nesse post tudo o que eu estava procurando! Agora é só me aprofundar no framework. Se existirem mais posts como esse por aí tenho certeza que a comunidade Python e Django vão crescer muito em quantidade e principalmente em qualidade! 100% produção…

    By: Bernardo Marambaia Reply →
    March 15, 2009 at 11:12 pm
  6. Verifiquei que no arquivo forms.py ao usarmos o método mark_safe, devemos incluir a classe safestring do Django.
    Para resolver o problema devemos incluir a linha from django.utils.safestring import mark_safe no início do arquivo /cliente/forms.py para importar o método mark_safe.
    Abs…

    By: Bernardo Marambaia Reply →
    March 16, 2009 at 12:24 am
  7. na linha
    $(“#”+objHtmlReturn).append(”+item.fields[fieldreturn]+”);

    qd escolho o bairro da um erro dizendo q a palavra ou o campo “fieldreturn” nao está definido por isso nao carrega as ruas no outro select

    By: Maria Reply →
    May 5, 2009 at 5:29 pm
  8. Excelente tutorial, colega. :)

    Parabéns XD

    By: Francisco Souza Reply →
    August 10, 2009 at 10:09 am
  9. Opa, tudo bom.
    Primeiro quero parabenizá-lo pelo artigo. Segundo informo que o método javascript declarado acima para atualizar o select html está quebrado. Criei outro método jQuery, que ficou assim:

    $( function() {
    $(“select#id_bairro”).change(
    function() {
    $.getJSON( “/cliente/getlogradouros?id=” + $(this).val(),
    function(j) {
    var options = ‘———- ‘;
    for ( var i = 0; i < j.length; i++) {
    options += ”
    + j[i].fields['logradouro']
    + ”;
    }
    $(“#id_logradouro”).html(options);
    $(“#id_logradouro option:first”).attr(‘selected’,
    ‘selected’);
    $(“#id_logradouro”).attr(‘disabled’, false);
    })
    $(“#id_logradouro”).attr(‘selected’, ‘selected’);
    })
    })

    Para que ele funcione, o metodo no módulo views.py precisa ser mudado para o método GET, que no meu caso ficou assim:

    def getlogradouros( request ):
    id = int( request.GET.get( ‘id’ ) )
    lista = Logradouro.objects.filter( bairro = id )
    if lista.count() > 0:
    json = serializers.serialize( “json”, lista )
    else:
    lista = [{"pk":"0", "fields":{'logradouro':"Nenhum registro"}}]
    json = simplejson.dumps( lista )
    return HttpResponse( json, mimetype = “application/json” )

    By: Helder Reply →
    August 27, 2009 at 4:41 pm
  10. Ola gostei do material que vc publicou, vc terminou a segunda parte deste tutorial referente ao sistema???

    By: luiz Martins Reply →
    July 13, 2010 at 11:46 am
    • @Luiz, nao cheguei a terminar, mas escrevi um artigo aqui no blog que fala um pouco sobre. O titulo é “Servidor Linux com Proxy e Controle de Banda”.
      []‘s

      By: gustavohenrique Reply →
      July 13, 2010 at 10:27 pm
  11. Parabéns pelo tutorial, muito legal.
    Alguém tem um site com o demo para testar?

    By: Guilherme Reply →
    June 17, 2011 at 7:07 pm
    • Guilherme,
      na verdade esse sistema eu nunca cheguei a terminar. Comecei portando de PHP quando ainda estava aprendendo django. Em outra ocasião precisei de algumas funcionalidades e então desenvolvi o bandcontrol, cujo código está no github e há um artigo sobre isso aqui no blog.
      Dá uma olhada no bandcontrol que talvez te ajude!

      By: gustavohenrique Reply → Author
      June 17, 2011 at 7:48 pm

Leave your comment below! Cancel Reply

View More Posts:
  • →

Tags

admin Django extjs firewall grails jquery KingHost liberações Linux manual model modelform mod_wsgi moeda brasileira mudanças mysql nível de serviço oo PagSeguro pdf php PIL pisa problemas proxy python qa qos real relacionamento roteamento service desk shell script sites tdd tipsforlinux traducao ubicomp ubuntu urllib virtualhost Webservices wikipedia xsol __init__

Recent Posts

  • Configurando um servidor LDAP no CentOS 6.2
  • Introdução ao padrão MVC no Ext JS 4
  • Virtualização com KVM
  • Autenticação Facebook no Grails
  • Grails com Sqlite3 no Ubuntu 11.04
  • Deploy no tomcat usando django-jython
  • Deploy múltiplas versões do Django no Nginx com VirtualEnv
  • Comandos básicos do Git
  • Introdução ao Apache Wicket
  • Feliz 2011

Archives

Categories

My tweets

  • @tregismoreira Genesis 7200 com android 4 2 days ago
  • @marcomaciel blz! 1 week ago
  • @marcomaciel hack com qualquer linguagem em qualquer plataforma pra mim ta valendo! #soudev 1 week ago
  • Fui instalar o android 2.3 da lg e agora meu celular não liga. #ffuuu 1 week ago
  • Tentando gerar uma NFe e não consigo =/ #stacktrace Impressionante como todos os sites e apps do governo são ruins. 2 weeks ago
  • More updates...

Powered by the inLine Minimal WordPress Theme