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

如何在Django模板中设置Radio Widget的选项值?

解决Django模板中单选按钮值设置问题

我来帮你搞定这个问题!你现在遇到的核心问题是用{{ radio.id }}获取选项值的方式不对,这个属性并不是用来存储你定义的Option主键的,所以才返回None。咱们一步步调整:

一、修正模板中的单选按钮值绑定

你当前手动编写<input>标签的思路没问题,但需要把value="{{ radio.id }}"改成{{ radio.value }}——这个属性才对应你在forms.py的OPTIONS里定义的Option主键值。同时别忘了加上name属性(否则表单提交后Django无法识别字段),以及可选的选中状态判断。修改后的模板代码如下:

{% for form in formset.forms %}
<div>
  <div>
    {% for radio in form.selected_options %}
      <label for="{{ radio.id_for_label }}">
        <input type="radio" 
               id="{{ radio.id_for_label }}" 
               name="{{ radio.name }}" 
               value="{{ radio.value }}"
               {% if radio.is_checked %}checked{% endif %}>
        {{ radio.choice_label }}
      </label>
    {% endfor %}
  </div>
</div>
{% endfor %}

二、(更省心的方案)让Django自动渲染单选部件

其实你完全不用手动拼接HTML,直接使用{{ radio }}就能让Django帮你生成完整且正确的单选按钮和标签,包括id、name、value、选中状态这些属性,既省事又不容易出错:

{% for form in formset.forms %}
<div>
  <div>
    {% for radio in form.selected_options %}
      {{ radio }}
    {% endfor %}
  </div>
</div>
{% endfor %}

三、forms.py的小优化(可选)

你生成选项列表的代码可以用Django ORM的values_list简化,效果和你之前的列表推导式完全一致,但代码更简洁:

class QuestionForm(forms.ModelForm):
    class Meta:
        model = Question
        fields = ('question_text',)
        labels = {'question_text': ''}

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['selected_option'] = forms.ChoiceField(
            # 直接用values_list生成(pk, 显示文本)的选项组
            choices=Option.objects.filter(question_id=self.instance.pk)
                                  .values_list('pk', '__str__'),
            required=True,
            widget=forms.RadioSelect(),
            error_messages={
                'required': 'The question form lacks a selected option'
            },
        )

内容的提问来源于stack exchange,提问作者user10755417

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:24:53