web2py:一页上有多个表单

时间:2016-11-07 22:00:46

标签: forms web2py multiple-forms

我正在尝试创建一个表单,显示列表中组中的所有产品。可以给它们一个数量并添加到报价中。然后将其存储在数据库中。

所有自动形式选项都不适用于我。因此,我已经使每个行显示给定产品的信息,其中包含数量框和添加项目按钮,它是自己的形式。但是使每种形式的循环都做得很奇怪。

控制器:

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行。 View具有以下2种形式,只有一个隐藏的div具有formkey和formname。因此,我无法命名表单以便正确处理它们:

<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)? 我尝试添加formname参数:

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

但是这只列出一个表格而另一个仍然命名为“默认”。

1 个答案:

答案 0 :(得分: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)