如何在Django模板中获取for循环生成的所有表单POST提交值
问题根因
你当前只能拿到最后一组值的原因有两点:
- HTML表单提交规则中,多个相同
name属性的输入项提交时,后面的值会覆盖前面的值,你循环生成的所有数字输入框、隐藏域都用了完全相同的name,所以POST请求里只会保留最后一组数据。 - 页面中所有输入框的
id都重复,不符合HTML规范,也会导致label点击选中输入框的联动功能失效。
解决方法
第一步:修改模板代码
给循环生成的输入项的name属性后缀加上[],让浏览器把同name的所有值按顺序组装成数组提交,同时把id改为动态值避免重复:
<div> <form action="change_number_of_days" method="post"> {% csrf_token %} {% for name in filenames %} <input type="number" name="number_of_days[]" id="number_of_days_{{ forloop.counter }}" value=200> <label for="number_of_days_{{ forloop.counter }}"> {{ name }} </label> <input type="hidden" value="{{ name }}" name="name_of_file[]"><br><br> {% endfor %} <button type="submit"> Gem </button> </form> </div>
第二步:修改视图代码
使用Django提供的getlist()方法获取同name的所有值,再按顺序配对文件名和对应的天数即可:
def change_number_of_days(request): if request.method == 'POST': # 按模板循环顺序获取所有天数、文件名列表 days_list = request.POST.getlist('number_of_days[]') filename_list = request.POST.getlist('name_of_file[]') # 遍历配对处理每一组数据 for filename, days in zip(filename_list, days_list): # 此处替换为你自己的业务逻辑 print(f"文件名:{filename},对应天数:{days}") return render(request, 'price_calculation_complete.html') return HttpResponse("error")
内容的提问来源于stack exchange,提问作者Matthias Hyldegaard Djernæs
相关产品推荐
相关产品推荐

