11nov

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

Posted by gustavohenrique as Django

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',
)

Páginas: 1 2 3 4 5


Versão para Impressora Versão para Impressora

9 Responses to Django com MySQL, JQuery, Ajax e JSON – Parte 1

Relsi

novembro 11th, 2008 at 18:20

Muito legal o tuto, parabéns!!

Hugs!!

Abaster

novembro 11th, 2008 at 19:20

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

Rânielli The head

novembro 11th, 2008 at 23:58

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

Leandro

novembro 13th, 2008 at 14:21

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 ?

Bernardo Marambaia

março 15th, 2009 at 23:12

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…

Bernardo Marambaia

março 16th, 2009 at 0:24

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…

Maria

maio 5th, 2009 at 17:29

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

Francisco Souza

agosto 10th, 2009 at 10:09

Excelente tutorial, colega. :)

Parabéns XD

Helder

agosto 27th, 2009 at 16:41

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

Comment Form