Forms web2py:一页上有多个表单
我正在尝试制作一个表格,在列表中显示一个组中的所有产品。可以给它们一个数量并将其添加到报价中。然后存储在数据库中 所有的自动表单选项都不适合我。因此,我用Quantity框和add item按钮将每一行显示给定产品的信息,这是它自己的表单。但是每个表单的循环都做了一些奇怪的事情 控制器:Forms web2py:一页上有多个表单,forms,web2py,multiple-forms,Forms,Web2py,Multiple Forms,我正在尝试制作一个表格,在列表中显示一个组中的所有产品。可以给它们一个数量并将其添加到报价中。然后存储在数据库中 所有的自动表单选项都不适合我。因此,我用Quantity框和add item按钮将每一行显示给定产品的信息,这是它自己的表单。但是每个表单的循环都做了一些奇怪的事情 控制器: products = db(db.product.group_id == productgroupnumber).select() forms=[] for product in products: f
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个表单,其中只有一个隐藏的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>
但是这只命名了一个表单,而另一个表单仍然命名为“Default”。在代码中,您在
for
循环中创建了多个表单,但退出循环后,您调用form.accepts()
。此时,form
的值是循环中创建的最后一个表单,因此只处理该表单
注意,初始创建表单时,form.accepts
(或首选的form.process
)方法将\u formname
和\u 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)
在代码中,在
for
循环中创建多个表单,但退出循环后,调用form.accepts()
。此时,form
的值是循环中创建的最后一个表单,因此只处理该表单
注意,初始创建表单时,form.accepts
(或首选的form.process
)方法将\u formname
和\u 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)
用户应该能够同时提交多个表单,还是一次提交仅包含一个表单?仅包含一个表单。因此,一行有一个数量字段和一个“添加到报价”按钮。一次只能添加产品。用户应该能够同时提交多个表单,还是一次提交仅包含一个表单?仅包含一个表单。因此,一行有一个数量字段和一个“添加到报价”按钮。一次只能添加产品。啊,我明白了。谢谢,这就回答了问题。你也提到了在提交时处理表格。我有命名的表格。但由于“Form”变量只存在于创建循环的范围内。如何在提交时再次处理它们?表单提交给生成它们的相同操作,因此相同的代码处理提交。当在创建时调用
form.process()
时,它会为表单生成隐藏的\u formname
和\u formkey
字段。当在提交时调用相同的方法时,它会检查\u formkey
字段并验证表单。啊,我明白了。谢谢,这就回答了问题。你也提到了在提交时处理表格。我有命名的表格。但由于“Form”变量只存在于创建循环的范围内。如何在提交时再次处理它们?表单提交给生成它们的相同操作,因此相同的代码处理提交。当在创建时调用form.process()
时,它会为表单生成隐藏的\u formname
和\u formkey
字段。当在提交时调用相同的方法时,它会检查\u formkey
字段并验证表单。