Published in 20:13 of 09/18/2012 by

Published in 20:13 of 09/18/2012

←Home

Search form with web2py

Quick and dirty search form example

Considering models/db.py

status_options = {"0": "pending", "1": "confirmed", "3": "canceled"}

db.define_table("orders",
    Field("id_buyer", "reference auth_user"),
    Field("order_date", "date"),
    Field("status",
          requires=IS_IN_SET(status_options),
          represent= lambda value, row: status_options[value]
          ),
    Field("obs","text")
)

And the search function controllers/default.py

import datetime

@auth.requires_login()
def index():
    # default values to keep the form when submitted
    # if you do not want defaults set all below to None

    status_default = request.vars.status
    date_initial_default = \
        datetime.datetime.strptime(request.vars.date_initial, "%Y-%m-%d") \
            if request.vars.date_inicial else None
    date_final_default = \
        datetime.datetime.strptime(request.vars.date_final, "%Y-%m-%d") \
            if request.vars.date_final else None
    obs_default = request.vars.obs


    # The search form created with .factory
    form = SQLFORM.factory(
                  Field("status",
                        default=status_default
                        requires=IS_EMPTY_OR(
                            IS_IN_SET(status_options, zero="-- All --")
                        ),
                  ),
                  Field("date_initial", "date", default=date_initial_default),
                  Field("date_final", "date", default=date_final_default),
                  Field("obs", default=obs_default),
                  formstyle='divs',
                  submit_button="Search",
                  )

    # The base query to fetch all orders of the current logged user
    query = db.orders.id_buyer == auth.user_id                  

    # testing if the form was accepted              
    if form.process().accepted:
        # gathering form submitted values
        status = form.vars.status
        date_initial = form.vars.date_initial
        date_final = form.vars.date_final
        obs = form.vars.obs

        # more dynamic conditions in to query
        if status:
            query &= db.orders.status == status
        if date_initial:
            query &= db.orders.order_date >= date_initial
        if date_final:
            query &= db.orders.order_date <= date_final
        if obs:
            # A simple text search with %like%
            query &= db.orders.obs.like("%%%s%%" % obs)            

    count = db(query).count()
    results = db(query).select(orderby=~db.orders.data)
    msg = T("%s registers" % count )
    return dict(form=form, msg=msg, results=results) 

Optionally you can create a view file in views/default/index.html

{{extend 'layout.html'}}
{{=form}}
<hr />
{{=msg}}
{{=results}}

the end result

Download the app: http://dl.dropbox.com/u/830444/web2py.app.busca.w2p

If you need a better and complex search engine I recommend Whoosh.

  • O Natal Animal 2013 está no ar in Home · 23:24 of 12/10/2013
  • Desenvolvendo protótipos para startups com Python e web2py in web2py · 20:25 of 11/19/2013
  • Gravando logs de aplicativos web2py in web2py · 00:29 of 01/21/2013

  • comments powered by Disqus Go Top