The thing is I have already tried that but I got no luck, I know my 
controller method is executed but the child selector still uses the 
validator defined in the model file. If I don't declare the validator in 
the model file expecting that my controller code assign a new validator it 
also does nothing.

This is my model file:

# -*- coding: utf-8 -*-
from gluon.tools import Auth

db = DAL('sqlite://modelo.db')
auth=Auth(db)
auth.define_tables(username=False, signature=True)

db.define_table('red_trafico',
               Field('nombre', 'string'))

db.define_table('canal',
               Field('id_red_trafico', 'reference red_trafico'),
               Field('nombre', 'string'))

db.define_table('formulario',
               Field('red_trafico', 'reference red_trafico'),
               Field('canal', 'reference canal'))

db.canal.id_red_trafico.requires = IS_IN_DB(db, 'red_trafico.id', 
'%(nombre)s')
db.formulario.red_trafico.requires = IS_IN_DB(db, 'red_trafico.id', 
'%(nombre)s')
db.formulario.canal.requires = IS_IN_DB(db, 'canal.id', '%(nombre)s')



this is my controller:

formulario = SQLFORM.grid(db.formulario)

def redTrafico():
    red_trafico = SQLFORM.grid(db.red_trafico)
    return locals()

def canal():
    canal = SQLFORM.grid(db.canal)
    return locals()

def onChangeRedTrafico():
    db.formulario.canal.requires = IS_IN_DB(db(db.canal.id_red_trafico == 
request.vars.red_trafico), 'canal.id', '%(nombre)s')
    print 'requires modificado'

def index():
    """
    example action using the internationalization operator T and flash
    rendered by views/default/index.html or views/generic.html

    if you need a simple wiki simply replace the two lines below with:
    return auth.wiki()
    """
    formulario_red_trafico = 
formulario.element('select[id=formulario_red_trafico]')
    formulario_red_trafico['_onchange'] = 'onChangeRedTrafico()'
    return dict(formulario=formulario)


And this is my view:

{{left_sidebar_enabled,right_sidebar_enabled=False,('message' in 
globals())}}
{{extend 'layout.html'}}

<script type='text/javascript'>
    console.log('seccion javascript ejecutada')
    function onChangeRedTrafico(){
        eval("ajax('{{=URL('default', 'onChangeRedTrafico')}}', 
['red_trafico'], '')");
    }
</script>

<a href={{=URL('default', 'redTrafico')}}>Red Trafico</a>
<br>
<a href={{=URL('default', 'canal')}}>Canal</a>
<br>
{{=formulario}}

I am using web2py version: Version 
2.14.6-stable+timestamp.2016.05.10.00.21.47

Is something wrong with my code? Because my onChangeRedTrafico() controller 
method (where I change the validator) gets called but nothing happens

Thanks


El viernes, 5 de agosto de 2016, 13:58:02 (UTC-5), Anthony escribió:
>
> On Friday, August 5, 2016 at 12:28:44 PM UTC-4, Bernardo Leon wrote:
>>
>> Hi, I have an SQLFORM.grid form and when I am inserting data I want to 
>> make the selectors work in cascade. I have seen some recipies where they 
>> create by hand the form using plain html and throw some jQuery in the 
>> middle but I dont like it, I like the cleaness of web2py so I am looking 
>> for a cleaner way to accomplish this.
>>
>> So far I am trying with ajax request and I have been able to call a 
>> function in my controller passing the id of the parent selector to finally 
>> change the child's selector IS_IN_DB validator. That was my idea, but it 
>> seems I cannot change the validator from de controller, only from the 
>> model; so is there a way to reload the model within an ajax request so I 
>> can change the behavior of my form at runtime? Is there a better/cleaner 
>> way to accomplish this?
>>
>
> First, note that the model file is re-executed on every request, so indeed 
> it does "reload" when you make an Ajax request. The problem is, your model 
> includes no logic to change the validator when the Ajax request is made. 
> You could add such logic, perhaps by sending some flag with the Ajax 
> request, or simply setting the alternative validator whenever request.ajax 
> == True.
>
> However, there is no need to make the change in the model file where the 
> table is initially defined, as you can change the validators for a given 
> field at any point in your code, such as in the controller. So, in the 
> controller that handles the Ajax request, you could do:
>
> db.mytable.myfield.requires = new_validator
>
> Anthony
>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to