I found the way to bypass the problem. I have changed the call to SQLFORM.grid from:
table=SQLFORM.grid(query, search_widget=search_form, fields=fields) to: table=SQLFORM.grid(qry, fields=fields, field_id=db.t.id,searchable=False) and I have added a normal form for performing searches ... form = SQLFORM.factory(Field('search')) if form.process().accepted: qry=search_query(form.vars.search) ... So, all together: default.py def search_query(search_text): words= search_text.split(' ') if search_text else [] query = db.t.id<0 queries=[] queries.append(db.t.id>0) for word in words: key,value=word.split(':') if ':' in word else ['',word] if key=='a': queries.append(db.t.a.contains(value)) elif key=='b': queries.append(db.t.b.contains(value)) else: queries.append(db.t.a.contains(value)|db.t.b.contains(value)) if len(queries) > 0: query = (reduce(lambda a,b:(a&b),queries)) return query def index(): qry=db.t.id<0 form = SQLFORM.factory(Field('search')) if form.process().accepted: qry=search_query(form.vars.search) fields=[db.t.a, db.t.b] table=SQLFORM.grid(qry, fields=fields, field_id=db.t.id,searchable=False ) return locals() index.html {{extend 'layout.html'}} {{=form}} {{=table}} On Friday, September 28, 2012 2:15:31 PM UTC+9, alex wrote: > > I have this table > > db.define_table('t', > Field('a', type='string'), > Field('b', type='string'), > ) > > db.t.insert(a='US', b='Washington') > db.t.insert(a='US', b='Rochester') > db.t.insert(a='US', b='Los Angeles') > db.t.insert(a='US', b='Minneapolis') > > Now I want to search the items in a grid with a custom search box. I would > like to input in the search box the name of the fields and the value I am > searching for in this way: > > a:s b:och b:er > > Meaning: find all the record where field a contains "s" and field b > contains 'och' and field b contains 'er' > > Copying from previous posts of this group, I have now this: > > default.py > def search_form(self,url): > form = FORM('', > INPUT(_name='keywords', _value=request.get_vars.keywords, > _style='width:200px;', > _id='keywords'), > INPUT(_type='submit',_value=T('Search')), > INPUT(_type='submit',_value=T('Clear'), > _onclick="jQuery('#keywords').val('');"), > _method="GET",_action=url) > return form > > def search_query(search_text): > words= search_text.split(' ') if search_text else [] > query = db.t.id<0 > queries=[] > queries.append(db.t.id>0) > for word in words: > key,value=word.split(':') if ':' in word else ['',word] > if key=='a': > queries.append(db.t.a.contains(value)) > elif key=='b': > queries.append(db.t.b.contains(value)) > else: > queries.append(db.t.a.contains(value)|db.t.b.contains(value)) > if len(queries) > 0: > query = reduce(lambda a,b:(a&b),queries) > return query > > def index(): > search_text=request.get_vars.keywords > query=search_query(search_text) > fields=[db.t.a, db.t.b] > table=SQLFORM.grid(query, search_widget=search_form, fields=fields) > return locals() > > index.html > {{extend 'layout.html'}} > {{=table}} > > Now, if in the search box I type > > a:s > The grid is empty and the answer is: *No records found* > the query shown is : ((t.id > 0) AND (t.a LIKE '%s%')) > > a:s a:s > The grid returns all the record of US correctly but it writes* **Invalid > query* above the grid > the query shown is : (((t.id > 0) AND (t.a LIKE '%s%')) AND (t.a LIKE > '%s%')) > > a:s b:e > same as above, the grid returns all the record correctly but it writes > *Invalid > query* above the grid > the query shown is : (((t.id > 0) AND (t.a LIKE '%s%')) AND (t.b LIKE > '%e%')) > > What am I doing wrong? > > --