2016-11-07 145 views
1

我正在嘗試製作一個窗體,顯示列表中的所有產品。可以給他們一個數量並添加到報價中。然後將其存儲在數據庫中。web2py:在一個頁面上的多個表格

沒有自動化表單選項適用於我。所以我已經使每行顯示給定產品的信息和數量框以及添加項目按鈕是它自己的形式。但是使每種形式的循環都在做一些奇怪的事情。

控制器:

products = db(db.product.group_id == productgroupnumber).select() 
forms=[] 
for product in products: 
    form = FORM(TABLE(TR(TD(product.productname), 
         TD((product.purchasecost or 0)), 
         TD((product.monthlycost or 0)), 
         TD(INPUT(_type='number', _name='quantity')), 
         TD(INPUT(_type='submit', _value=T('Add to Offer'))) 
         ) 
        ) 
       ) 
    forms.append(form) 

session.quotedproducts = [] 
if form.accepts(request, session, keepvalues = True): 
    product = db(db.product.id == product_id).select().first() 
    offeritem = [product_id, request.vars.quantity, product.purchasecost, product.monthlycost] 
    session.quotedproducts.append(offeritem) 
    response.flash = T("Item added to offer")` 

對於2行。該視圖具有以下2種形式,只有一個帶formkey和formname的隱藏div。所以我不能命名錶格以便正確處理它們:

<form action="#" enctype="multipart/form-data" method="post"> 
    <table> 
     <tr> 
      <td>Block of 10 Phone Numbers</td> 
      <td>19.0</td> 
      <td>0</td> 
      <td><input name="quantity" type="number" /></td> 
      <td><input type="submit" value="Add to Offer" /></td> 
     </tr> 
    </table> 
</form>  

<form action="#" enctype="multipart/form-data" method="post"> 
    <table> 
     <tr> 
      <td>100 Block of Phone Numbers</td> 
      <td>149.0</td> 
      <td>0</td> 
      <td><input name="quantity" type="number" /></td> 
      <td><input type="submit" value="Add to Offer" /></td> 
     </tr> 
    </table> 

<!--Why is there only one of these??--> 
    <div style="display:none;"> 
     <input name="_formkey" type="hidden" value="b99bea37-f107-47f0-9b1b-9033c15e1193" /> 
     <input name="_formname" type="hidden" value="default" /> 
    </div> 
</form> 

如何爲表單提供個人名稱(最好是product.id)? 我嘗試添加表格名稱參數:

form.accepts(request, session, formname=product.id) 

但是,這只是一個名稱的形式和其他的仍命名爲「默認」。

+0

用戶應該能夠同時提交多個表單,還是單個提交中只包含一個表單? – Anthony

+0

只有一個表單。所以一行有一個數量字段和一個「添加到報價」按鈕。一次只能添加產品。 – Eddie

回答

0

在您的代碼中,您在for循環中創建了多個表單,但在退出循環後,請致電form.accepts()。此時,form的值是循環中創建的最後一個表單,因此只處理該表單。

注意,當最初創建一個形式中,所述form.accepts(或優選form.process)方法增加了_formname_formkey隱藏字段的形式(這些被用於CSRF保護)。當表單提交後調用相同的方法時,它還處理表單驗證。因此,考慮到您的工作流程,您必須在創建和提交時處理所有表單。可能是這樣的:

products = db(db.product.group_id == productgroupnumber).select() 
forms = [] 
for product in products: 
    quantity_name = 'quantity_%s' % product.id 
    form = FORM(TABLE(TR(TD(product.productname), 
         TD((product.purchasecost or 0)), 
         TD((product.monthlycost or 0)), 
         TD(INPUT(_type='number', _name=quantity_name)), 
         TD(INPUT(_type='submit', _value=T('Add to Offer'))) 
         ) 
        ) 
       ) 
    if form.process(formname=product.id, keepvalues=True).accepted: 
     offeritem = [product.id, form.vars[quantity_name], 
        product.purchasecost, product.monthlycost] 
     session.quotedproducts.append(offeritem) 
     response.flash = T("Item added to offer") 
    forms.append(form) 
+0

啊我明白了。謝謝,這回答了這個問題。 – Eddie

+0

您提到處理提交的表單也。我有表單命名。但是,'Form'變量只存在於創建循環的範圍內。如何在提交時再次處理它們? – Eddie

+0

表單被提交給生成它們的相同動作,所以相同的代碼處理提交。當在創建時調用'form.process()'時,它會爲表單生成隱藏的'_formname'和'_formkey'字段。在提交時調用相同的方法時,它會檢查'_formkey'字段並驗證表單。 – Anthony