I have the following code to display information in a shopping-cart manner:
<form method="POST" action="/updateorder/{{item.idordre}}">
{%for parts in viewParts %}
<div >
<input id="idpart" name="idpart" value="{{parts.idpart}}"></div>
<td><div >
<input id="quantity" name="quantity" required type="number" value="{{parts.quantity}}">
</div></td>
{%endfor%}
<div >
<input id="submit" name="submit" type="submit"value="Update quantity">
</div>
</form>
There might be several instances of the same formfields with idpart and quantity where the user can change the quantity and submit the update.
@app.route('/updateorder/<int:ident>',methods=['GET','POST'])
def updateorder(ident):
form = updateOrder()
if request.method =="POST":
quantityChange = request.form.to_dict()
dostuff()
When i receive the form in my route i only get the first form value. Is it possible to receive data like this at all?
CodePudding user response:
If you're saying you have multiple fields with same name in the same form, then submitting the form will only give you one instance of it (because they have the same names, they overwrite each other or you will get just the instance that has a value)
A possible solution is to make the names unique by appending an index to the name e.g. idpart_1, idpart_2
(you can even use the idpart number itself i.e. idpart_{{idpart}}
. On submit, you then process the names via a pattern e.g.
for k,v in request.form.items():
if k.startswith("idpart_"):
# This field is an idpart number. You can then figure out which one it is
idpart = k.split("idpart_")[1] # Tells you which one you're dealing with