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.