2011-05-17 98 views
2

我有一個django應用程序,需要通過複選框輸入大量數據。Django Form複選框組

a = forms.BooleanField(required=False, initial=True) 
b = forms.BooleanField(required=False, initial=True) 
c = forms.BooleanField(required=False, initial=True) 

但是,這看起來雜亂無章的模板代碼e.g:

{% if form.data.a%}A{% endif %} 
{% if form.data.a%}B{% endif %} 
{% if form.data.a%}C{% endif %} 

我希望會有一個複選框列表這樣的一些方式。

但是,這需要我都具有相同的名稱和不同的值,例如,複選框:

<input type="checkbox" name="letters" value="a" /> 
<input type="checkbox" name="letters" value="b" /> 
<input type="checkbox" name="letters" value="c" /> 

所以在我的模板代碼我可以說request.POST.getlist(「letters」)

,但我似乎無法找到有關如何設置BooleanFields具有相同名稱和不同值的任何信息。

您能有所幫助,或者有沒有這樣做的任何更簡單的方法?

回答

8

MultipleChoiceField

形式:

CHOICES = (
(0, 'a'), 
(1, 'b'), 
(2, 'c'), 
) 

class MyForm(forms.Form): 
    letters = forms.MultipleChoiceField(
      choices=CHOICES, 
      label="...", 
      required=True/False) 

的,你可以使用:

request.POST.getlist(「letters」) 

或不看POST之後您檢查形式的有效性:

form.cleaned_data.letters 
+0

完美,謝謝!我甚至不需要request.POST.getlist(「字母」)。我只是使用form.cleaned_data.letters – Mark 2011-05-19 10:41:00

2

是不是有一個原因,你爲什麼不循環字段和打印他們胡亂?換句話說,這樣的:

{% for field in form %} 
    {{ field }} 
{% endfor %} 

...這將打印的所有領域,秩序,包括你的複選框,並會選擇哪所需要的複選框進行檢查?這似乎是迄今爲止最簡單的機制。

如果你真的需要循環只是複選框,是可以做到的,但我會警告說,我要解釋的機制是無證並受某些邊緣情況下失敗。儘管如此,你仍然可以這樣做:

{% for field in form %} 
    {% if 'checkbox' in field.as_widget %} 
     {{ field }} 
    {% endif %} 
{% endfor %} 

這將遍歷表單中的所有字段,但僅打印複選框。代碼工作的原因是因爲field.as_widget是打印小部件的HTML的方法,並且由於小部件是<input type="checkbox">,字符串「複選框」出現在其中(而不是大多數其他小部件)。

當你處理的形式,你不應該惹的事情request.POST.getlist。只需實例化表單並將request.POST作爲第一個位置參數,如form documentation中所述。

+0

這也適用。但我不知道有關MultipleChoiceField。謝謝 – Mark 2011-05-19 10:41:42