Django模板for循环生成的多个checkbox如何不使用forms提交到views.py
解决方案
问题原因
- 所有checkbox使用了相同的
name属性,表单提交时会传递多个同名参数 request.POST是Django的QueryDict对象,调用get()方法默认只会返回同名参数的最后一个值,因此只能拿到最后一个选中的checkbox内容
具体修改步骤
1. 调整模板中checkbox的name属性
将原来的checkbox定义的name属性值后追加[],明确标记这是多值参数:
<!-- 修改前 --> <input type="checkbox" id="{{ doc.document_id }}" name="docid" value="{{ doc.path }}"> <!-- 修改后 --> <input type="checkbox" id="{{ doc.document_id }}" name="docid[]" value="{{ doc.path }}">
2. 调整views.py中参数获取逻辑
用QueryDict的getlist()方法替换get()方法,即可拿到所有选中的checkbox值。
同时补充请求方法判断,避免GET请求时无意义取值;另外修正原代码中docs列表赋值覆盖的问题,否则模板渲染的文档列表只会保留最后一个活动对应的文档:
def client_home(request): client_pr = Client_Profile.objects.get(user_id=request.user) events = Event.objects.filter(client_id=client_pr.pk) # 修正docs查询逻辑,避免循环覆盖,一次性查询所有活动关联的文档 docs = Document.objects.filter(event_id__in=events.values_list('pk', flat=True)) if request.method == 'POST': name = request.POST.get('word') # 用getlist获取所有选中的docid selected_docs = request.POST.getlist('docid[]') print(name) print(selected_docs) context = {'events': events, 'docs': docs} return render(request, 'Elasticsearch/form.html', context)
补充说明
如果不想修改模板的name属性,保持原来的name="docid",只需要把取值逻辑改成request.POST.getlist('docid')也可以正常拿到所有选中值。
内容的提问来源于stack exchange,提问作者YASH JARIWALA
相关产品推荐
相关产品推荐

