如何在Django中呈现单个单选按钮选项?

Joh*_*don 21 django django-templates

如果我的模型包含带有RadioSelect小部件的ChoiceField,我如何在模板中单独渲染单选按钮?

假设我正在构建一个Web应用程序,允许公司的新员工在桌面上选择他们想要的计算机类型.这是相关的模型:

class ComputerOrder(forms.Form):
    name = forms.CharField(max_length=50)
    office_address = forms.Charfield(max_length=75)
    pc_type = forms.ChoiceField(widget=RadioSelect(), choices=[(1, 'Mac'), (2, 'PC')])
Run Code Online (Sandbox Code Playgroud)

在模板上,如何渲染Mac选择按钮?如果我这样做,它会呈现所有选择:

{{ form.pc_type  }}
Run Code Online (Sandbox Code Playgroud)

有点天真我试过这个,但它没有产生输出:

{{ form.pc_type.0 }}
Run Code Online (Sandbox Code Playgroud)

(我在SO上发现了一些类似的问题:

在Django表单中,如何呈现单选按钮以便在页面上分离选项?
Django Forms:如何迭代Django形式的字段选择

但我觉得他们没有好的答案.有没有办法复活旧问题?)

sup*_*cuo 46

Django 1.4+ 允许您迭代 a中的选项RadioSelect以及

{% for choice in form.pc_type %}
  {{ choice.choice_label }}
  <span class="radio">{{ choice.tag }}</span>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

我不确定这个改变是否允许你使用你描述的语法({{ form.pc_type.0 }}) - 如果没有,你可以通过for上面的循环和像这样的标记解决这个限制{% if forloop.counter0 == 0 %}.

如果你绑定到Django <1.4,你可以render()按照建议覆盖方法,或者使用稍微更详细但更简单的选项来自己在模板中构建表单字段:

 {% for choice in form.pc_type.field.choices %}
   <input name='{{ form.pc_type.name }}' 
     id='{{ form.pc_type.auto_id }}_{{ forloop.counter0 }}' type='radio' value='{{ choice.0 }}'
     {% if not form.is_bound %}{% ifequal form.pc_type.field.initial choice.0 %} checked='checked' {% endifequal %}
   {% else %}{% ifequal form.pc_type.data choice.0 %} checked='checked' {% endifequal %}{% endif %}/>
   <label for='{{ form.pc_type.auto_id }}_{{ forloop.counter0 }}'>{{ choice.1 }}</label>
 {% endfor %}
Run Code Online (Sandbox Code Playgroud)

(choice.0并且choice.1是你的choices两元组中的第一和第二项)


Chr*_*att 6

各个无线电输入的渲染由RadioSelect小部件的render方法处理.如果你想要一个不同的渲染,子类RadioSelect,相应地改变render方法,然后使用你的子类作为字段的小部件.