Skip to content

Instantly share code, notes, and snippets.

@rafaelchagasb
Created October 6, 2012 17:05
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save rafaelchagasb/3845490 to your computer and use it in GitHub Desktop.
Save rafaelchagasb/3845490 to your computer and use it in GitHub Desktop.
Filtro de municípios por estados - Django 1.3
/* >>>>>>>>>>>>>>> models.py <<<<<<<<<<<<< */
from django.db import models
class MeuModelo(models.Model):
estado = models.ForeignKey('Estado')
cidade = models.ForeignKey('Cidade')
class Pais(models.Model):
class Meta:
db_table ='pais'
cod_pais = models.IntegerField(primary_key=True,db_column='cod_pais')
sgl_pais = models.CharField(max_length=2,db_column='sgl_pais')
nom_pais = models.CharField(max_length=255,db_column='nom_pais')
class Estado(models.Model):
class Meta:
db_table ='estado'
cod_estado = models.IntegerField(primary_key=True,db_column='cod_estado')
cod_pais = models.ForeignKey('Pais',db_column='cod_pais')
nom_estado = models.CharField(max_length=255,db_column='nom_estado')
sgl_estado = models.CharField(max_length=2,db_column='sgl_estado')
def __unicode__(self):
return self.nom_estado
class Cidade(models.Model):
class Meta:
ordering = ('nom_cidade',)
db_table ='cidade'
cod_cidade = models.IntegerField(primary_key=True,db_column='cod_cidade')
cod_estado = models.ForeignKey('Estado',db_column='cod_estado')
nom_cidade = models.CharField(max_length=255,db_column='nom_cidade')
def __unicode__(self):
return self.nom_cidade
/* >>>>>>>>>>>>>>> forms.py <<<<<<<<<<<<< */
from django.forms import ModelForm
from projeto.app.models import *
from django import forms
import os
class MeuModelForm(ModelForm):
class Meta:
model = MeuModelo #modelo que contem os campos de estado e municipio
class Media:
js = ('/static/js/meu_js.js',)
def __init__(self, *args, **kwargs):
super(MeuModelForm, self).__init__(*args, **kwargs)
if kwargs.has_key( 'instance' ):
if kwargs['instance'].estado_id != 0 and kwargs['instance'].estado_id != None: #se o estado estiver selecionado(em caso de edição) já faz o filtro inicial nos municipios
cidades = Cidade.objects.filter(cod_estado=kwargs['instance'].estado_id)
cids = [ ( cidade.cod_cidade, cidade.nom_cidade) for cidade in cidades ]
self.fields['cidade'].choices = cids
/* >>>>>>>>>>>>>>> admin.py <<<<<<<<<<<<< */
from django.contrib import admin
from projeto.app.models import *
from projeto.app.forms import *
from projeto.app import views
from django.conf.urls.defaults import patterns, include, url
class MeuModeloAdmin(admin.ModelAdmin):
form = MeuModeloForm
raw_id_field = ('cidade','estado')
#adiciona a url para pegar os municipios filtrados . Acessar url por http://dominio:porta/admin/app/modelo/get_estados/?estado=id_estado ex.: http://localhost:8000/admin/projeto/app/get_estados/?estado=1
def get_urls(self, *args, **kwargs):
urls = super(MeuModeloAdmin, self).get_urls(*args, **kwargs)
myurls = patterns('',
(r'^get_cidades/$', views.get_cidades, {}, 'get_cidades'),
)
return myurls + urls
/* >>>>>>>>>>>>>>>>>>>>>> views.py <<<<<<<<<<<<<<<<<<*/
def get_cidades(request):
estado = request.GET.get('estado')
if estado:
cidades = Cidade.objects.filter(cod_estado=estado)
else:
cidades = Cidade.objects.all()
data = []
for c in cidades:
data.append({'cod_cidade': c.cod_cidade, 'unicode': unicode(c)})
json = simplejson.dumps(data)
return HttpResponse(json, mimetype='application/json')
/* >>>>>>>>>>>>>> meu_js.js <<<<<<<<<<<*/
if (window.meu_js === undefined) {
window.meu_js = function() {
var that = {}; // o que é publico
that.init = function() {
$a("#id_estado").change(change_estado);
}
var change_estado = function() {
// carrega cidades
var self = $a(this);
var url = '/admin/app/modelo/get_estados/';
var data = {'estado': self.val()};
console.log(data.estado);
// aqui é feito o ajax
$a.getJSON(url, data, function(json) {
var cidades = $a('#id_cidade');
// limpa os options de cidades
$a('#id_cidade option').remove();
for (i in json) {
var obj = json[i];
cidades.append($a('<option>').attr('value', obj.cod_cidade).attr('text', obj.unicode).html(obj.unicode));
}
});
}
return that;
}()
}
$(function() {
window.meu_js.init();
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment