Fala pessoal, sou novato em web2py e tive um pouco de dificuldade para implementar um formulário de busca personalizado, após pesquisar um pouco cheguei ao seguinte resultado abaixo, é bem simples mas talvez possa ajudar alguém.
Crie duas tabelas bem simples só para exemplo
db:
Cidade = db.define_table('cidade',
Field('id','id'),
Field('nome','string'),
Field('descricao','string')
)
Pessoa = db.define_table('pessoa',
Field('id','id'),
Field('nome','string'),
Field('idade','string'),#coloquei string para agilizar, pois se não teria que tratar
Field('sexo','string'),
Field('id_cidade','reference cidade')
)
Pessoa.id_cidade.requires=IS_IN_DB(db,Cidade.id , '%(nome)s')
Pessoa.sexo.requires=IS_IN_SET(['masculino','feminino'])
controllers:
def busca():
pessoas = ''
form = SQLFORM.factory(
Field('idade',
label='Idade',
),
Field('sexo',
label='Sexo',
requires = IS_EMPTY_OR(IS_IN_SET(['masculino','feminino']))
),
Field('cidade',
label='Cidade',
requires = IS_EMPTY_OR(IS_IN_DB(db, Cidade.id , '%(nome)s'))
),_method='POST',_action=URL('busca')
)
if form.accepts(request.vars):
idade = request.vars.idade
sexo = request.vars.sexo
cidade = request.vars.cidade
query = []
if idade != "":
query.append(Pessoa.idade >= idade)
pass
if sexo != "":
query.append(Pessoa.sexo == sexo)
pass
if cidade != "":
query.append(Pessoa.id_cidade == cidade)
pass
variaveis = [idade,sexo,cidade]
resultado = filter(lambda x: len(x) > 0, variaveis)
if len(resultado) == 0:
query.append(Pessoa.id)
pass
query = reduce(lambda a,b: (a&b),query)
pessoas = db(query).select(Pessoa.ALL,
left=[
Pessoa.on((Pessoa.id_cidade == Cidade.id)),
]
)
return dict(form = form, pessoas = pessoas)