Página 1 de 1

Django combobox encadenados

Publicado: Vie, 25 Mar 2011, 16:28
por Metal
Tengo una tabla provincia y otra municipio relacionadas, quiero cuando seleccione una provincia q automáticamente se carguen los datos del otro combobox con los municipios de esta provincia.

Models.py--------------------------------------------------------------------

Código: Seleccionar todo

class Provincia( models.Model ):
    cod = models.IntegerField( primary_key = True )
    descripcion = models.CharField( max_length = 130 )

    def __unicode__( self ):
        return "%s" % self.descripcion

class Municipio( models.Model ):
    cod = models.IntegerField( primary_key = True )
    descripcion = models.CharField( max_length = 130 )
    provincia = models.ForeignKey( Provincia, db_index = True )

    def __unicode__( self ):
        return "%s" % self.descripcion
forms.py--------------------------------------------------------------------

Código: Seleccionar todo

class UserRegistrationForm( RegistrationForm ):
    provincia = forms.ModelChoiceField( queryset = Provincia.objects, label = 'Provincia', empty_label = 'Provincia' )
    municipio = forms.ModelChoiceField()
    carnet_identidad = forms.IntegerField( label = 'Carnet de Identidad' )
    direccion = forms.CharField( label = 'Dirección' )
    cargo = forms.CharField( label = 'Cargo' )
El problema realmente esta q el ModelChoiceField necesita un queryset y no quiero q para municipio me cargue ningún dato hasta q no se seleccione una provincia.

Gracias de ante mano.

Re: Django combobox encadenados

Publicado: Vie, 25 Mar 2011, 19:13
por williansvi
El problema que tienes es mas de javaScript que de Django... Un poco de Ajax te resolvera el problema

Slds
Willians

Re: Django combobox encadenados

Publicado: Vie, 25 Mar 2011, 19:43
por hugo
williansvi escribió:perl -e 'print $i=pack(c5,(41*2),sqrt(7056),(unpack(c,H)-2),oct(115),10);'
Apretaste con la firma esa, Willians :lol:

Re: Django combobox encadenados

Publicado: Mar, 29 Mar 2011, 15:10
por Metal
Con ayuda de "Felix Pupo Perez" logre hacer esta tarea q como bien me decía todo el mundo "eso es problema de javaScript". Voy a publicar aquí el HOW TO para otros:

El formulario tiene un pequeño cambio, lo q antes era así:

Código: Seleccionar todo

municipio = forms.ModelChoiceField()
Ahora es asi:

Código: Seleccionar todo

municipio = forms.ModelChoiceField( queryset = Municipio.objects.none(), label = 'Municipio', empty_label = 'Selecciona Municipio' )
Este cambio va dirigido a el queryset q es obligado y debe ser vació para q no me cargue los municipios.

En urls.py:

Código: Seleccionar todo

url(r'^municipios',municipios, name = 'cargar_municipios'),
La vista:

Código: Seleccionar todo

from django.utils import simplejson
from django.http import HttpResponse
from apps.models import Municipio #El modelo
def municipios( request ):
    if request.is_ajax():
        response = HttpResponse(mimetype="text/javascript")
        municipios = []
        datos = {}
        get_provincia = request.GET.get( u'provincia' )
        if get_provincia is not None:
            municipios = Municipio.objects.filter( provincia = get_provincia )
            if municipios:
                for m in municipios:
                    datos[m.cod] = m.descripcion
    response.write(simplejson.JSONEncoder().encode(datos))
    return response
Nada muy complicado aquí, solo q voy codificando con json los datos de un diccionario de ids y valores para poblar el otro combobox.

Aquí termina la parte de django (espero no se me haya olvidado nada :roll: )

Luego use el pluguin jQuery Related Selects https://github.com/ehynds/jquery-related-selects

La documentación esa muy buena y trae ejemplos tambien muy buenos. En mi caso puse:

Código: Seleccionar todo

<script src="/media_sitio/js/jquery.relatedselects.min.js" type="text/javascript"></script>
<script>
$(function()
{
	$("#register").relatedSelects({
		onChangeLoad: '{% url cargar_municipios %}',
		selects: {
			'provincia':		{ loadingMessage:'Cargando Municipios...' },
			'municipio':		{}
		}
	});
});
Esto fue todo. Espero le sirva a alguien.

Re: Django combobox encadenados

Publicado: Jue, 31 Mar 2011, 11:10
por yosle
hugo escribió:
williansvi escribió:perl -e 'print $i=pack(c5,(41*2),sqrt(7056),(unpack(c,H)-2),oct(115),10);'
Apretaste con la firma esa, Willians :lol:
jajaja, RTFM ... :lol:

Un solo comentario mas al respecto :lol: :mrgreen: