You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 07:57:04