如何在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
相关产品推荐
相关产品推荐

