我有一个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设置为具有相同名称和不同值的任何信息。
你能帮忙,或者有更简单的方法吗?
答案 0 :(得分:10)
形式:
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中所述。