web2py的SQLFORM.grid自带的查询功能非常丰富好用,能实现各种组合,可在grid的参数,searchable=True打开。
但是grid提供查询的字段不是我们在fields参数中设置的字段,而且顺序也不跟grid中Fields一致,这是因为grid的查询字段的控制和展现顺序默认使用的是构建表时字段属性,例如:
db.define_table('employeeInfo', Field('EmployeeName'), Field('EmployeeAge',searchable=False)), 特别是在使用到grid使用到多张表连接联查时,会把所用表的各种字段都放在这里下拉,很是不友好,而且默认还要多一个我们展现中看不到的id字段我们希望在grid设置了什么字段,什么顺序,那查询组建中提供下拉查询的就是什么字段和顺序:
优化改造的方法很简单,找到gluon文件下的sqlhtml.py文件,找到这么一行:
if searchable: sfields = reduce(lambda a, b: a + b, [[f for f in t if f.readable and f.searchable] for t in tables])
直接改为:
if searchable: grid_fields_len=len(fields) sfields=[] #优化了查询字段,fields的最后一个始终是id字段,这个循环是为了把虚拟字段去掉,虚拟字段是无法查询的,发在这里会出错,最后一个id字段不要 for i in range(0,grid_fields_len-1): if type(fields[i]) == type(fields[grid_fields_len-1]): sfields.append(fields[i])