2014-09-10 60 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