Django combobox encadenados

Lenguajes dinamicos, hojas de estilo, frameworks, CMS...

Moderadores: frank, dxfiles

Responder
Metal
Mensajes: 32
Registrado: Sab, 07 Ago 2010, 14:09
Ubicación: Python
Contactar:

Django combobox encadenados

Mensaje por Metal » Vie, 25 Mar 2011, 16:28

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.
Axioma de Espinosa
Si funciona, no lo toque.

Avatar de Usuario
williansvi
Mensajes: 51
Registrado: Sab, 07 Ago 2010, 14:09

Re: Django combobox encadenados

Mensaje por williansvi » Vie, 25 Mar 2011, 19:13

El problema que tienes es mas de javaScript que de Django... Un poco de Ajax te resolvera el problema

Slds
Willians
perl -e 'print $i=pack(c5,(41*2),sqrt(7056),(unpack(c,H)-2),oct(115),10);'

Avatar de Usuario
hugo
Mensajes: 1430
Registrado: Sab, 07 Ago 2010, 14:09
Ubicación: La Habana
Contactar:

Re: Django combobox encadenados

Mensaje por hugo » Vie, 25 Mar 2011, 19:43

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:
Lo único que necesita el mal para triunfar es que los hombres buenos no hagan nada.
- Edmund Burke

Metal
Mensajes: 32
Registrado: Sab, 07 Ago 2010, 14:09
Ubicación: Python
Contactar:

Re: Django combobox encadenados

Mensaje por Metal » Mar, 29 Mar 2011, 15:10

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.
Axioma de Espinosa
Si funciona, no lo toque.

Avatar de Usuario
yosle
Mensajes: 110
Registrado: Sab, 07 Ago 2010, 14:09
Ubicación: /usr/sbin/yosle
Contactar:

Re: Django combobox encadenados

Mensaje por yosle » Jue, 31 Mar 2011, 11:10

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:

Responder