我有一个像这样的django形式:
class HelpForm (forms.form):
queue = forms.ChoiceField(
widget=forms.Select(attrs={'class': 'form-control'}),
label=_('What can we help you with today?'),
required=True,
choices=()
)
此表单的选项填充在以下视图中:
form = HelpForm(initial=initial_data)
form.fields['queue'].choices = [(q.id, q.title) for q in Queue.objects.filter(allow_public_submission=True)] + \
[('', 'Other')]
当调用{{form.queue}}
时,模板中此表单的默认呈现是一个下拉列表。但我需要它作为单选按钮字段,所以我在模板中为每个下拉值执行此操作:
<input type="radio" name="help_form" id="order_issues" value="{{form.queue.field.choices.2.0}}"/>
<label for="id_order_issues">{{form.queue.field.choices.2.1}}</label>
现在,当我提交此表单时,queue
值显示为None
,即使我已做出选择并且因为这是必填字段,表单提交也会失败。当然,表单还有其他字段,它们按预期工作。我究竟做错了什么?任何帮助将不胜感激!
答案 0 :(得分:1)
您必须首先将ChoiceField
实例与模板同步,例如将字段重命名为order_issues
class HelpForm (forms.form):
order_issues = forms.ChoiceField(
widget=forms.Select(attrs={'class': 'form-control'}),
label=_('What can we help you with today?'),
required=True,
choices=()
)
当然,观点也必须改变:
form = HelpForm(initial=initial_data)
form.fields['order_issues'].choices = [(q.id, q.title) for q in Queue.objects.filter(allow_public_submission=True)] + \
[('', 'Other')]
最后是模板:
<input type="radio" name="order_issues" id="id_order_issues" value="{{form.order_issues.field.choices.2.0}}"/>
<label for="id_order_issues">{{form.order_issues.field.choices.2.1}}</label>
您的代码无效,因为django需要input
的{{1}}属性等于表单类中定义的名称,name
&# 39; s input
属性必须以id
_ field_name
HTML内容:这是额外的,但了解标签对attrib对输入标记的影响可能很有用。