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 [email protected].
For more options, visit https://groups.google.com/d/optout.