Crear combobox filtrado por otro con datos de ambos en tablas DAL

724 views
Skip to first unread message

Roberto Tello

unread,
May 22, 2012, 11:50:26 AM5/22/12
to web2py-usuarios
Hola estimados,

Tengo dos tablas relacionadas en DAL:

db.define_table('tarea_fam',
Field('descripcion', 'string', length=30,unique=True))

db.define_table('tarea_subfam',
Field('familia',db.tarea_fam),
Field('descripcion', 'string', length=30,unique=True),
Field('ident','integer',unique=True))

Con la primera cargo un combobox en un formulario de esta forma:

<td height='30' style="vertical-align:middle">{{=(cmb_tiposdos)}}</
td>

De donde cmb_tiposdos lo genero antes en el controlador de esta forma
y se lo paso:

lista_td=[]
rows_td= db(db.tarea_fam.descripcion!
=None).select(db.tarea_fam.id,db.tarea_fam.descripcion)
for row in rows_td:
lista_td.append([str(row.descripcion), str(row.id) ])
cmb_tiposdos = (SELECT([OPTION(tipodosCmb[0],
_value=tipodosCmb[1] ) for tipodosCmb in lista_td],_name='tipodosCmb',
_style='height:23px; width:260px; valign:middle;font-size: 12px; '))



Luego, al seleccionar un dato de el combobox necesito que se me carge
el segundo combobox con los datos que corresponda de la tabla
tarea_subfam (los relacionados con la primera), pero no sé como
hacerlo.

Se me ocurre que debe ser con alguna funcion jquery, he encontrado
casos en que funciona, pero en esos ejemplos los datos los escriben en
bruto en la vista html, yo necesito extraerlos directamente desde las
tablas, ese es mi problema.

Si alguien me pudiera guiar o indicar com ohacer lo agradecería un
montón. Muchas gracias por su tiempo y ayuda.

Saludos

nicolás rosbaco

unread,
May 22, 2012, 3:10:33 PM5/22/12
to web2py-...@googlegroups.com
a ver si este ejemplo te sirve.
manipulo el formulario de register... en la vista va esto:

    jQuery("#auth_user_provincia").change(function(){
        var pcia = jQuery("#auth_user_provincia").val();
        $.ajax({
          async: false,
          url: "{{=URL('default','combo_localidad')}}",
          data: 'provincia='+pcia,
          context: jQuery('#ventana'),
          success: function(datos){
            jQuery("#auth_user_ciudad").html(datos);
          }
        });
    });

hay un campo provincia que si se modifica carga las ciudades asociadas

esto va en el controller

## este combo lo usa via ajax la función de register para completar localidad en función de provincia   
def combo_localidad():
    provincia = request.vars.provincia
    localidades = db((db.localidades.id_provincia==db.provincias.id) & (db.provincias.nombre==provincia)).select(db.localidades.ALL, orderby=db.localidades.nombre)
    if len(localidades)>0:
        opciones = ''
        for localidad in localidades:
            opciones += '<option value=\"%(opcion)s\">%(opcion)s</option>' %dict(opcion=localidad.nombre)
    else:
        opciones = '<option>No hay opciones!</option>'       
    return opciones

espero sirva.
suerte
--
"En un país colonial las oligarquías son las dueñas de los diccionarios" (John William Cooke)

Roberto Tello

unread,
May 22, 2012, 3:43:31 PM5/22/12
to web2py-...@googlegroups.com
La verdad no comprendo la parte con ajax, esa funcion es llamada
despues de seleccionar o hacer onchange en el primer combobox?

nicolás rosbaco

unread,
May 22, 2012, 3:57:58 PM5/22/12
to web2py-...@googlegroups.com

Cuando se modifica el campo, que se selecciona por id, se ejecuta la función ajax, fíjate que el return de la función de mi controlador  va a parar a un cierto elemento

_______________
desde celu y posiblemente apurado. sepa disculpar errores de edición.

El may 22, 2012 7:43 p.m., "Roberto Tello" <tellor...@gmail.com> escribió:

La verdad no comprendo la parte con ajax, esa funcion es llamada
despues de seleccionar o hacer onchange en el primer combobox?



El día 22 de mayo de 2012 15:10, nicolás rosbaco <anti...@gmail.com> escribió:

> a ver si este ejemplo te sirve.
> manipulo el formulario de register... en la vista va esto:
>

>  ...

Roberto Tello

unread,
May 22, 2012, 6:04:32 PM5/22/12
to web2py-...@googlegroups.com
La verdad no entiendo nada de Ajax, solo ahora leyendo he entendido
que sirve para realizar lo que necesito, pero en el ejemplo no entendí
nada (la parte Ajax).

De todas formas gracias :), sigo buscando.

Alan Etkin

unread,
May 23, 2012, 10:02:35 AM5/23/12
to web2py-usuarios
Acá te paso una receta:

1) Donde va a ir el combo aplicás un id a la etiqueta determinado
2) Creás una acción controllers/<nombre>/combo2.load que toma uno o
más parámetros y devuelve el html del nuevo combo. Tenés que crear una
vista asociada views/<nombre>/combo2.load que no use el layout (sin
{{extend ... }}) si no están habilitadas las vistas genéricas.
3) Creás una función javascript en la vista inicial que recupera el
parámetro del primer combo con jQuery,
y llama y llama a la acción de 2) con el o los parámetros obtenidos,
insertando el resultado en la etiqueta
del paso 1) también con jQuery.
4) Asociás la función de 3) a onselect o evento similar que llame a la
función javascript cuando el usuario seleccione un ítem del priner
combo.

Fijate en www.web2pyslices.com que hay algunas recetas con el código
de ejemplo:
http://www.web2pyslices.com/slice/show/1503/vvmselectwidget-dropdown-chain-cascade-widget



On 22 mayo, 18:04, Roberto Tello <tellorobe...@gmail.com> wrote:
> La verdad no entiendo nada de Ajax, solo ahora leyendo he entendido
> que sirve para realizar lo que necesito, pero en el ejemplo no entendí
> nada (la parte Ajax).
>
> De todas formas gracias :), sigo buscando.
>
> El día 22 de mayo de 2012 15:57, nicolás rosbaco <antiya...@gmail.com> escribió:
>
>
>
>
>
>
>
> > Cuando se modifica el campo, que se selecciona por id, se ejecuta la función
> > ajax, fíjate que el return de la función de mi controlador  va a parar a un
> > cierto elemento
>
> > _______________
> > desde celu y posiblemente apurado. sepa disculpar errores de edición.
>
> > El may 22, 2012 7:43 p.m., "Roberto Tello" <tellorobe...@gmail.com>
> > escribió:
>
> > La verdad no comprendo la parte con ajax, esa funcion es llamada
> > despues de seleccionar o hacer onchange en el primer combobox?
>
> > El día 22 de mayo de 2012 15:10, nicolás rosbaco <antiya...@gmail.com>

Roberto Tello

unread,
May 23, 2012, 4:43:07 PM5/23/12
to web2py-...@googlegroups.com
Estimados, gracias por vuestra ayuda.

Finalmente encontré un ejemplo con ajax muy simple y claro, lo dejo
para quien lo necesite:

http://www.web2pyslices.com/slice/show/1467/cascading-drop-down-lists-with-ajax



Saludos
Reply all
Reply to author
Forward
0 new messages