我有这个表单字段:
class NewVenueForm(forms.Form):
features = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple(), queryset=hmod.Feature.objects.all(), required=False)
这个模型:
class Feature(models.Model):
'''A feature that a listing has'''
name = models.CharField(max_length=255, blank=True, null=True)
description = models.CharField(max_length=500, blank=True, null=True)
def __str__(self):
return self.name
这个HTML:
<form method="POST" enctype="multipart/form-data">
<div>
<div {% if form.title.errors %}class="field_error"{% endif %}>
Venue Title
{{ form.title }}
{{ form.title.errors }}
</div>
Features
<br/>
{% for key, value in form.features.field.choices %}
<input type="checkbox" id="{{value}}" value="{{key}}" name="feature">
<label for="{{value}}">
{{ value }}
</label>
{% endfor %}
<input type="submit" value="Save">
</div>
</form>
复选框看起来像是在工作,但是我无法将多个选项保存到Django表单字段中。
我的views.py看起来像这样:
if request.method == 'POST':
form = NewVenueForm(request.POST)
if form.is_valid():
print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
print(form.cleaned_data['features'])
我已经尝试将值实际保存到模型中,但意识到我甚至没有超越这一点。 。 。打印出form.cleaned_data返回一个空列表:[] !!
有什么想法吗?任何帮助将不胜感激。
答案 0 :(得分:3)
你的问题很简单。您有>>> def foo(): [][0]
...
>>> foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in foo
IndexError: list index out of range
>>> import pdb;pdb.pm()
> <stdin>(1)foo()
(Pdb) x = 4
(Pdb) [x for _ in range(2)]
*** NameError: name 'x' is not defined
(Pdb) interact
*interactive*
>>> [x for _ in range(2)]
[4, 4]
>>>
,与字段名称name="feature"
不匹配。它应该是:
features
顺便说一句,我会避免使用<input type="checkbox" id="{{value}}" value="{{key}}" name="features">
。如果您让Django使用id={{ value }}
为您渲染字段,则输入ID将为{{ form.features }}
,id_features_0
,依此类推。最好使用id_features_1
之类的东西 - 模型多选字段的键应该是唯一的,但值可能不是。如果您更改此设置,则需要更新id="id_feature_{{ key }}
以匹配。