Django表单复选框组

时间:2011-05-17 14:52:04

标签: django django-forms

我有一个django应用程序,通过复选框需要大量输入。

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

但是在模板代码中看起来很麻烦,例如:

{% 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设置为具有相同名称和不同值的任何信息。

你能帮忙,或者有更简单的方法吗?

2 个答案:

答案 0 :(得分:10)

查看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   

答案 1 :(得分: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中所述。