将多个复选框保存到Django ModelMultipleChoiceField

时间:2016-02-09 20:36:02

标签: django python-3.x django-forms

我有这个表单字段:

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返回一个空列表:[] !!

有什么想法吗?任何帮助将不胜感激。

1 个答案:

答案 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 }}以匹配。