Yeah, that's not going to work. All your Ajax callback does is set the 
validator for the field in question, but it doesn't do or return anything. 
That change is only in effect for the duration of the Ajax request itself. 
It will not change any HTML on the page (as you do not return an HTML), nor 
will it affect any subsequent requests (e.g., the form submission).

Note, your application code is executed on every request, so changing an 
attribute in one request does not persist to subsequent requests. If you 
need the validator to have a particular value upon form submission, you 
will need to set that value within the same request as the submission 
itself. Also, if you need the HTML on the page to change as the result of 
an Ajax request, then the Ajax request must actually return the new HTML 
(or return the relevant data needed for the JS code to construct the HTML).

Anthony

On Friday, August 5, 2016 at 4:19:22 PM UTC-4, Bernardo Leon wrote:
>
> 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