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

Aplicação Cliente

Criando a aplicação Cliente

Como mencionado anteriormente, nossas aplicações são como módulos do projeto. A princípio vamos tratar apenas da aplicação cliente, que é responsável pelo cadastro de clientes.
Dentro do diretório do projeto, utilizamos o script manage.py para criar nossa aplicação. Podemos executar o script pelo comando python manage.py ou dar permissão de execução e executar como ./manage.py. Vamos optar pelo segundo método:

gu@notebook:~/projetos/sigep$ chmod +x manage.py
gu@notebook:~/projetos/sigep$ ./manage.py startapp cliente
gu@notebook:~/projetos/sigep$ ls cliente/
__init__.py models.py views.py

Foi criado então o diretório cliente contendo os seguintes arquivos:
__init__.py: Tal como no diretório do projeto, indica que a aplicação também é um pacote
models.py: Aqui definimos a classes que Django vai transformar em tabelas MySQL
views.py: Nosso controlador, onde definimos os métodos da nossa aplicação

Estrutura de Dados do Projeto

GrupoVencimento
Define os grupos de vencimento e o dia do mês. Ex.:
        grupovencimento: GrupoA
        dia_vencimento: 10
Futuramente esses dados serão usados no momento que forem emitidos relatórios de clientes por grupo e geração de boletos bancários.

Cliente
Dados referentes aos clientes. tipo_pessoa pode ser ‘F’ – pessoa física, ‘J’ – pessoa jurídica ou ‘R’ – pessoa física que representa pessoa jurídica. Ex.: Um microempresário que faz o contrato no nome dele porém o serviço é contratado para a empresa. Os campos nome, cpf e rg não podem conter valores duplicados

Bairro
Bairros onde o provedor atende. Por antender em uma única cidade, não foi necessário a criação de uma tabela para cidades e estados.

Logradouro
Ruas, avenidas, travessas ou praças onde há disponibilidade de instalação da internet.

Diagrama de estrutura de dados

Diagrama de estrutura de dados

Criando o Model

Um model contém a estrutura de dados do sistema. A grosso modo, pode-se dizer que é o arquivo que contém classes que correspondem às tabelas do banco de dados, e os atributos dessas classes correspondem aos campos das tabelas.
Cada aplicação no Django contém um arquivo chamado models.py. Nesse arquivo que serão criadas nossas classes de modelo:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
from django.db import models
 
class Bairro(models.Model):
  bairro = models.CharField(max_length=150)
  def __unicode__(self):
    return self.bairro
  class Meta:
    db_table = 'bairro'
 
class Logradouro(models.Model):
  bairro = models.ForeignKey(Bairro)
  logradouro = models.CharField(max_length=250)
  def __unicode__(self):
    return self.logradouro
  class Meta:
    db_table = 'logradouro'
 
class GrupoVencimento(models.Model):
  grupo_vencimento = models.CharField("Grupo",max_length=20)
  dia_vencimento = models.IntegerField("Dia",max_length=2)
  def __unicode__(self):
    return self.grupo_vencimento
  class Meta:
    db_table = 'grupovencimento'
    verbose_name = 'Grupo de Vencimento'
    verbose_name_plural = 'Grupos de Vencimento'
    unique_together = ['grupo_vencimento']
 
class Cliente(models.Model):
  TIPO_PESSOA = (
    ('F','Pessoa Fisica'),
    ('J','Pessoa Juridica'),
    ('R','Representante de Pessoa Juridica')
  )
  grupovencimento = models.ForeignKey(GrupoVencimento,verbose_name="Grupo")
  nome = models.CharField("Nome/Razao Social",max_length=200)
  apelido = models.CharField("Apelido/Nome Fantasia",max_length=200,blank=True,null=True)
  cpf = models.CharField("CPF/CNPJ",max_length=14,unique=True)
  rg = models.CharField("RG/IE",max_length=11,blank=True,null=True)
  orgao_rg = models.CharField("Orgao RG",max_length=6,blank=True,null=True)
  tipo_pessoa = models.CharField(max_length=1,choices=TIPO_PESSOA)
  data_nascimento = models.DateField(blank=True,null=True)
  data_cadastro = models.DateField(auto_now_add=True)
  logradouro = models.ForeignKey(Logradouro,verbose_name='Endereco',blank=True,null=True)
  numero = models.CharField(max_length=50,blank=True,null=True)
  referencia = models.CharField(max_length=250,blank=True,null=True)
 
  cep = models.PositiveIntegerField(max_length=8,blank=True,null=True)
  def __unicode__(self):
    return self.nome
  class Meta:
    db_table = 'cliente'
    unique_together = ('nome','cpf','rg')

Esse processo de converter classes em tabelas é chamado de ORM – Mapeamento Objeto-Relacional. Para criar nossas tabelas é necessário primeiramente criar a base de dados no mysql e depois executar o script manage.py no diretório do nosso projeto:

gu@notebook:~/projetos/sigep$ mysqladmin -u root -p create sigepdjang
gu@notebook:~/projetos/sigep$ ./manage.py syncdb
Creating table auth_permission
Creating table auth_group
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site

Em seguida o script perguntará se deseja criar um super-usuário para acesso ao nosso sistema. Esse tipo de autenticação do django é usado na interface de administração automática que veremos mais a frente. No nosso projeto, utilizaremos esse mesmo tipo de autenticação, logo é necessário digitar yes para poder criar uma conta. Digite o nome do super-usuário, um e-mail válido e uma senha. Se tudo foi feito corretamente, no final será exibido:

Superuser created successfully.
Installing index for auth.Permission model
Installing index for auth.Message model

Para finalizar, é necessário incluir nossa aplicação na variável INSTALLED_APPS dentro do arquivo settings.py. Essa variável contém as aplicações utilizadas no nosso projeto, portanto para cada aplicação criada é preciso defini-la.

1
2
3
4
5
6
7
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'sigep.cliente',
)

Pages: 1 2 3 4 5

You can leave a response, or trackback from your own site.

11 Responses to “Django com MySQL, JQuery, Ajax e JSON – Parte 1”

  1. Relsi disse:

    Muito legal o tuto, parabéns!!

    Hugs!!

  2. Abaster disse:

    Muito bom, dei só uma olhada mas com esse tipo de material o Django ira crescer cada vez mais.

  3. Rânielli The head disse:

    Fala rapaz parabens ai ficou muito bom ,,
    uma abraço

  4. Leandro disse:

    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 ?

  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…

  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…

  7. Maria disse:

    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

  8. Excelente tutorial, colega. :)

    Parabéns XD

  9. Helder disse:

    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” )

  10. luiz Martins disse:

    Ola gostei do material que vc publicou, vc terminou a segunda parte deste tutorial referente ao sistema???

    • gustavohenrique disse:

      @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

Leave a Reply

Powered by WordPress | Shop the Best Verizon Wireless Deals. | Thanks to Best CD Rates, Credit Cards and Credit card