2012-04-19 86 views
17

如果我有一個包含帶有RadioSelect小部件的ChoiceField的模型,如何在模板中單獨呈現單選按鈕?如何在Django中呈現單個單選按鈕選項?

假設我正在構建一個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')]) 

在模板上,我怎麼渲染只是 Mac的選擇按鈕?如果我這樣做,它使所有的選擇:

{{ form.pc_type }} 

有點天真的我想這一點,但它沒有產生輸出:

{{ form.pc_type.0 }} 

(我在這裏找到了幾個類似的問題對SO:

In a Django form, how do I render a radio button so that the choices are separated on the page?
Django Forms: How to iterate over a Choices of a field in Django form

但我不覺得他們有很好的答案。有沒有辦法重新)

回答

40

Django的1.4+ allows you to iterate了一個RadioSelect的選擇,沿

{% for choice in form.pc_type %} 
    {{ choice.choice_label }} 
    <span class="radio">{{ choice.tag }}</span> 
{% endfor %} 

我不知道,如果這種變化使您可以使用您所描述的語法({{ 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 %} 

choice.0choice.1在第一和第二項的choices兩元組)

+0

{{} choice.1必須{{choice.1}} 真棒解決方案:d – Sirion 2014-08-29 09:44:49

+1

感謝您的指正!請記住,你總是可以直接通過點擊某人的回答下的「編輯」來建議編輯:) – supervacuo 2014-08-29 11:00:07

5

單個無線電輸入的渲染由RadioSelect小部件的render方法處理。如果您需要不同的渲染,子類RadioSelect,請相應地更改render方法,然後將您的子類用作字段的小部件。

4

我想簡單地查看裏面有什麼可供選擇場的循環會告訴一個他們需要知道。例如,我所需要的值來設置圍繞該選項的範圍(對顏色等)一類:

<div> 
    {% for radio_input in form.role %} 
     {# Skip the empty value #} 
     {% if radio_input.choice_value %} 
      <span class="user-level {{ radio_input.choice_value }}">{{ radio_input }}</span> 
     {% endif %} 
    {% endfor %} 
</div> 

有幾個屬性,你可以看到,讓你不必使用序。

PyCharm Debugging Inside a Template

+0

@Emily - 這是[PyCharm](https://www.jetbrains.com/pycharm/)的截圖。 – Freddie 2016-08-11 16:54:29