2014-09-10 43 views
1

请考虑我是web2py中的新手。接受POST和GET的搜索屏幕

我有一个控制器的这个功能来搜索公司的条目。我们的目标是在数据库从一种形式三个参数搜索,但我希望函数接受GET以及参数:

@auth.requires_login() 
def index(): 
    from datetime import datetime 

    data['subtitle'] = 'My Screen' 

    form = SQLFORM.factory(
     Field('company', 
      type="reference company", 
      label='Company', 
      widget=SQLFORM.widgets.options.widget, 
      requires=IS_IN_DB(mongodb, mongodb.company.id, '%(name)s') 
     ), 
     Field('initial_date', 
      label='Initial Date', 
      type="date", 
      requires=IS_NULL_OR(IS_DATE(format='%d/%m/%Y')) 
     ), 
     Field('final_date', 
      label='Final Date', 
      type="date", 
      requires=IS_NULL_OR(IS_DATE(format='%d/%m/%Y')) 
     ) 
    ) 

    if str(request.env.request_method) == 'POST': 
     print request.post_vars 
     if form.accepts(request.post_vars, keepvalues = True): 

      params = {} 
      if form.vars.company is not None: 
       params['company'] = form.vars.company 
      if form.vars.initial_date is not None: 
       params['initial_date'] = form.vars.initial_date 
      if form.vars.final_date is not None: 
       params['final_date'] = form.vars.final_date 

      print 'Params: ' 
      print params 

      redirect(URL('index', vars=params)) 

     else: 
      for f in form.errors: 
       print f + ': ' + form.errors[f] 

     lista = {} 
    else: 
     query = None 
     if request.get_vars.company is not None: 
      query = mongodb.entry.company == request.get_vars.company 
     if request.get_vars.initial_date is not None: 
      query &= mongodb.entry.date >= datetime.strptime(request.get_vars.initial_date, '%Y-%m-%d') 
     if request.get_vars.final_date is not None: 
      query &= mongodb.entry.date <= datetime.strptime(request.get_vars.final_date, '%Y-%m-%d') 

     print 'Query: ' 
     print query 
     if query is not None: 
      list = mongodb(query).select() 
     else: 
      list = {} 

    data['form'] = form 
    data['list'] = list 

    return dict(data=data) 

完全只有当我提供该公司的作品。如果我在日期之间搜索,即使日期在数据库中匹配,也不会显示结果。

Web2py缺乏很好的例子。有人可以帮忙吗?

回答

1

而不是使用POST表单,然后重定向到一个GET请求相同的动作,为什么不通过GET提交的形式开始:

form = SQLFORM.factory(..., _method='get') 

关于您的查询,query &=将无法​​正常工作当query开始为None

+0

不错的解决方案。事实上,我不知道可以像这样定义一个表单。关于查询对象,这个想法刚开始时有一些价值,可以在下面使用。我会在明天早上测试,然后我会接受它。 – 2014-09-11 03:39:34

+0

使用基于SQL的适配器,'None&='会生成一个异常。使用MongoDB,它不会产生异常,但显然这个查询并不会起作用。所以,只要确保'query'不是'None',当它到达第一个'&='时。 – Anthony 2014-09-11 13:15:49