como jQuery dentro de default.py

24 views
Skip to first unread message

nicolás rosbaco

unread,
Feb 26, 2011, 12:19:48 AM2/26/11
to web2py-...@googlegroups.com
Hola muchachos (y muchachas?): estoy intentando agregar una linea con una sentencia jQuery dentro de una función en default.py.

Concretamente: aceptado un formulario quiero modificar el innerHTML de un determinado DIV de mi página (previa consulta a una base de datos)...

Hago esto:

   if form.accepts(request.vars, session):
        registro = db(db.productos.id==request.vars.desc_id).select().first()
        if registro:
            jQuery('#descripcionEleccion').html(registro.descripcion)

El tema es que me larga un error:

jQuery('#descripcionEleccion').html(registro.descripcion)
NameError: global name 'jQuery' is not defined

 
¿wath ocurre?

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

Luis Díaz

unread,
Feb 26, 2011, 12:26:24 AM2/26/11
to web2py-...@googlegroups.com
lee esta parte del libro:

seguro que aclarar tus dudas

Díaz Luis
TSU Analisis de Sistemas
Universidad de Carabobo

Luis Díaz

unread,
Feb 26, 2011, 12:30:28 AM2/26/11
to web2py-...@googlegroups.com
disculpa amigo lo escribí mal es:

nicolás rosbaco

unread,
Feb 26, 2011, 9:01:04 AM2/26/11
to web2py-...@googlegroups.com
Hola y gracias por responder.... el tema es que igual sigo sin entender que pasa:

Enteiendo (vos dirás si estoy en lo correcto) las sentencias jQuery no irian en default.py, sino en la vista

Ahora intenté con esto en la vista:

<script>
$('#no_table_codbarras').change(function() {
  $('#no_table_cantidad').focus();
    var codigo=jQuery('#no_table_codbarras').val()
    {{registros=db(db.productos.id==codigo).select()}}
    {{if registros:}}
    alert('ja ja');
    {{pass}}
});
</script>

Tengo el siguiente problema, me devuelve que codigo (la variable) no se conoce o no esta definido.... evidentemente no puedo mezclar código python con jQuery...

Ando medio perdido.

Luis Díaz

unread,
Feb 26, 2011, 9:48:33 AM2/26/11
to web2py-...@googlegroups.com
  if form.accepts(request.vars, session):
        registro = db(db.productos.id==request.vars.desc_id).select().first()
        if registro:
return "jQuery('#descripcionEleccion').html('%s');" % repr(registro.descripcion)


de esta forma no te funciona?

nicolás rosbaco

unread,
Feb 26, 2011, 10:47:19 AM2/26/11
to web2py-...@googlegroups.com
Hola Luis... mirá lo implementé del siguiente modo (en default.py)

def compras():
    form = SQLFORM.factory(
                           Field('codbarras',  label='Código'), 
                           Field('desc_id', 'reference productos', required=True,  label='Descripción',  requires=IS_IN_DB(db,'productos.id','%(descripcion)s', error_message='Producto NO registrado')), 
                           Field('cantidad',  'double',  default=1), 
                           _id='buscoProducto')

    if form.accepts(request.vars, session):
        registro = db(db.productos.id==request.vars.desc_id).select().first()
        if registro:
            return "jQuery('#descripcionEleccion').html('%s');" % repr(registro.descripcion)
    else:
        return dict(form=form)

    return dict(form=form)

Misteriosamente cuando el formulario es enviado, y aceptado, la vista (compras.html) se recarga y todo el contenido que tiene es la cadena literal:

jQuery('#descripcionEleccion').html(''cerveza quilmes cristal 1 litro'');

Es decir se carga una página que como TODO contenido tiene la linea anterior...


de todos modos te pediría que mires lo de acá abajo (no se interpreta una variable)


Hola y gracias por responder.... el tema es que igual sigo sin entender que pasa:

Enteiendo (vos dirás si estoy en lo correcto) las sentencias jQuery no irian en default.py, sino en la vista

Ahora intenté con esto en la vista:

<script>
$('#no_table_codbarras').change(function() {
  $('#no_table_cantidad').focus();
    var codigo=jQuery('#no_table_codbarras').val()
    {{registros=db(db.productos.id==codigo).select()}}
    {{if registros:}}
    alert('ja ja');
    {{pass}}
});
</script>

Tengo el siguiente problema, me devuelve que codigo (la variable) no se conoce o no esta definido.... evidentemente no puedo mezclar código python con jQuery...

Ando medio perdido.




Gracias ;-) 

DenesL

unread,
Feb 26, 2011, 11:56:02 AM2/26/11
to web2py-usuarios
Vamos por partes.

On Feb 26, 10:47 am, nicolás rosbaco <antiya...@gmail.com> wrote:
> Hola Luis... mirá lo implementé del siguiente modo (en default.py)
>
> def compras():
>     form = SQLFORM.factory(
>                            Field('codbarras',  label='Código'),
>                            Field('desc_id', 'reference productos',
> required=True,  label='Descripción',
> requires=IS_IN_DB(db,'productos.id','%(descripcion)s',
> error_message='Producto NO registrado')),
>                            Field('cantidad',  'double',  default=1),
>                            _id='buscoProducto')
>
>     if form.accepts(request.vars, session):
>         registro = db(db.productos.id
> ==request.vars.desc_id).select().first()
>         if registro:
>             return "jQuery('#descripcionEleccion').html('%s');" %
> repr(registro.descripcion)

Aqui retornas una cadena de caracteres.
web2py no invoca la vista cuando se retorna una cadena, solo devuelve
la cadena, lo cual generalmente ocurre cuando el controlador genera la
pagina o devuelve algo para ser usado por un componente ajax por
ejemplo.
La cadena en este caso contiene codigo Javascript (JS), el cual por
fuera de un tag SCRIPT como parte de una pagina HTML no hace nada, es
solo una cadena de caracteres.

>     else:
>         return dict(form=form)
>
>     return dict(form=form)

Al devolver un dictionario si se invoca la vista correspondiente, o si
no existe la generica.

> Misteriosamente cuando el formulario es enviado, y aceptado, la vista
> (compras.html) se recarga y todo el contenido que tiene es la cadena
> literal:
>
> jQuery('#descripcionEleccion').html(''cerveza quilmes cristal 1 litro'');
>
> Es decir se carga una página que como TODO contenido tiene la linea
> anterior...
>
> de todos modos te pediría que mires lo de acá abajo (no se interpreta una
> variable)
>
> Hola y gracias por responder.... el tema es que igual sigo sin entender que
> pasa:

Espero que este claro ahora.
Todo lo anteriormente dicho esta en el manual, su lectura es una buena
inversion de tiempo.

Luis Díaz

unread,
Feb 26, 2011, 11:56:07 AM2/26/11
to web2py-...@googlegroups.com
ummm ok..

def compras():
    form = SQLFORM.factory(
                           Field('codbarras',  label='Código'), 
                           Field('desc_id', 'reference productos', required=True,  label='Descripción',  requires=IS_IN_DB(db,'productos.id','%(descripcion)s', error_message='Producto NO registrado')), 
                           Field('cantidad',  'double',  default=1), 
                           _id='buscoProducto')
script = None
    if form.accepts(request.vars, session):
        registro = db(db.productos.id==request.vars.desc_id).select().first()
        if registro:
            script = "jQuery('#descripcionEleccion').html('%s');" % repr(registro.descripcion)
    

    return dict(form=form, script=script)


y agregas esto al final de la vista:

{{ if script: }}
     <script>
         {{ =script }}
     </script>
{{ pass #if }}



Díaz Luis
TSU Analisis de Sistemas
Universidad de Carabobo






nicolás rosbaco

unread,
Feb 26, 2011, 12:30:22 PM2/26/11
to web2py-...@googlegroups.com
El 26 de febrero de 2011 13:56, DenesL <dene...@yahoo.ca> escribió:
Vamos por partes.

On Feb 26, 10:47 am, nicolás rosbaco <antiya...@gmail.com> wrote:
> Hola Luis... mirá lo implementé del siguiente modo (en default.py)
>
> def compras():
>     form = SQLFORM.factory(
>                            Field('codbarras',  label='Código'),
>                            Field('desc_id', 'reference productos',
> required=True,  label='Descripción',
> requires=IS_IN_DB(db,'productos.id','%(descripcion)s',
> error_message='Producto NO registrado')),
>                            Field('cantidad',  'double',  default=1),
>                            _id='buscoProducto')
>
>     if form.accepts(request.vars, session):
>         registro = db(db.productos.id
> ==request.vars.desc_id).select().first()
>         if registro:
>             return "jQuery('#descripcionEleccion').html('%s');" %
> repr(registro.descripcion)

Aqui retornas una cadena de caracteres.

Claro, a ver si no entendí mal: yo llamo al función desde una llamada a la función ajax... que de acuerdo con lo que entendí de la lectura "rellena" el elemento con ID específicado con el resutado de la ejecución de la función....

esta sería la llamada:

ajax('{{=URL('averiguaProducto', args=[desc,'dos'])}}', ['orden'], 'descripcionEleccion');

 
web2py no invoca la vista cuando se retorna una cadena, solo devuelve
la cadena, lo cual generalmente ocurre cuando el controlador genera la
pagina o devuelve algo para ser usado por un componente ajax por
ejemplo.

aja. esto no lo sabía ni remotamente. Me decís que si el return es una cadena NUNCA se invocaría la vista. Esto si ocurriría cuando se devuelve un diccionario?? únicamente en ese caso??

nicolás rosbaco

unread,
Feb 26, 2011, 12:32:59 PM2/26/11
to web2py-...@googlegroups.com
voy a re formular el tema porque se me encarajinó.... perdón ;-( a tod@s!

hilo nuevo con pregunta mejor formulada...

DenesL

unread,
Feb 26, 2011, 12:54:35 PM2/26/11
to web2py-usuarios
Casi, el problema es que los caracteres son "escapados"
jQuery(&#x27;#descripcionEleccion&#x27;).html(&#x27;mesa
cuadrada&#x27;);

para evitar esto es mejor usar
script=SCRIPT("jQuery...")

y remover <script> y </script> en la vista.
Ademas no puedes usar '%s' con %repr() porque duplica las comillas
sencillas.

Pero ese script no se ejecuta, hay que colocarlo dentro de un document
ready,
asi funciona JS, yo aprendi con sudor y lagrimas ;)

script = SCRIPT("""jQuery(document).ready(function() {
jQuery('#descripcionEleccion').html('%s');
});
""" %registro.descripcion)

Reply all
Reply to author
Forward
0 new messages