Django表单同name的radio单选框互斥、无法获取列表如何解决?
问题原因
HTML 原生的单选框(radio)分组规则为:name 属性相同的单选框属于同一分组,同一分组内最多只能选中一个选项。你当前所有题目对应的单选框都共用 givenAns 作为 name 属性值,自然会出现全局互斥的情况,且表单提交时只会上传最后一次选中的那个值,request.POST.getlist('givenAns') 最多只能拿到 1 个元素,不可能获取到所有题目的答案。
另外你的模板代码存在语法疏漏:array_column="{{ i.pk }} 后缺少闭合的双引号,会导致后续的 value 属性解析异常,也会影响值的正常提交。
修复方案
第一步:修改模板代码
给每道题的单选框设置独立的 name 属性,带上当前题目的主键,保证每道题的单选框是独立分组,不会和其他题目互斥:
<form method="post" action="{% url 'app:AnsSubmission' %}"> {% csrf_token %} {% for i in Exam %} <div class="form-group col-xl-12"> <label>{{ i.question }}</label> <div class="radio"> <label><input type="radio" class="mx-2" name="givenAns_{{ i.pk }}" value="True" required>True</label> </div> <div class="radio"> <label><input type="radio" class="mx-2" name="givenAns_{{ i.pk }}" value="False" required>False</label> </div> </div> {% endfor %} <button type="submit" class="btn btn-primary">Submit</button> </form>
如果需要保留 array_column 自定义属性,补全双引号即可:array_column="{{ i.pk }}"。
第二步:修改后端视图取值逻辑
按命名规则遍历所有题目,逐个获取对应提交的答案:
def AnsSubmission(request): if request.method == "POST": givenAns_list = [] # 这里的Exam查询集要和渲染模板时用的查询集保持一致,避免拿到多余题目 for question in Exam.objects.all(): # 按name前缀+题目主键的规则,获取当前题的提交答案 ans = request.POST.get(f'givenAns_{question.pk}') givenAns_list.append({ 'question_pk': question.pk, 'answer': ans == 'True' # 直接转成布尔值,方便后续业务逻辑处理 }) # 后续处理逻辑示例 for item in givenAns_list: this_givenAns = item['answer'] # 你的判分、存储等业务代码
内容的提问来源于stack exchange,提问作者Kanchon Gharami
相关产品推荐
相关产品推荐

