2012-07-25 18 views
3

我想知道如何以color(多對多字段)的形式填充來自CheckboxSelectMultiple小部件的值。如何使用Django表單中的多個複選框保存多對多字段

#models.py

class Color(models.Model): 
    RED = 1 
    BLACK = 2 

    COLOR_CHOICES = (
     (RED, _('Red')), 
     (BLACK, _('Black')), 
    ) 

    name = models.CharField(_('Color'), max_length=512, 
         choices=COLOR_CHOICES, blank=True) 
class Car(models.Model): 
    color = models.ManyToManyField(Color, blank=True, null=True) 

    def save(self): 
     self.slug = slugify(self.name) 
     super(Car, self).save() 

#forms.py

class AddCar(forms.ModelForm): 
    color = forms.MultipleChoiceField(
     choices=Color.COLOR_CHOICES, 
     widget=forms.CheckboxSelectMultiple(), 
     required=False 
    ) 

#view.py

def add(request): 
    if request.method == 'POST': 
     form = AddCar(request.POST) 
     ... 
     if form.is_valid(): 
      car = form.save(commit=False) 

      for c in request.POST.getlist('color'): 
       car.color.add(c) 

      car.save() 
      form.save_m2m() 

      return redirect('/') 

#ERROR

'Car' instance needs to have a primary key value before a many-to-many relationship can be used. 

回答

3

你沒有得到的複選框來展示,或者是你想擺脫的錯誤?如果是後者,請在保存表單時嘗試刪除commit=False

更新: Color模型未指定任何字段。給它一個,例如color = IntegerField(choices=COLOR_CHOICES)

AddCar表格,給出choices=Color.COLOR_CHOICES如果錯誤 - 您必須給它一個實際存在的對象的元組(Color.COLOR_CHOICES只是代碼常量)。同時你應該使用ModelMultipleChoiceField,這需要一個queryset參數,如:

colors = forms.ModelMultipleChoiceField(queryset=Color.objects, widget=forms.CheckboxSelectMultiple(), required=False)

https://docs.djangoproject.com/en/dev/ref/forms/fields/#modelmultiplechoicefield

+0

複選框正在顯示,我得到的視圖中選定的值,但我不能保存它們。刪除commit = False後,我得到這個錯誤:插入或更新表「cars_car_color」違反外鍵約束 – howtodothis 2012-07-25 04:18:48

+0

好吧,更新可能的解決方案。 – Raekkeri 2012-07-25 04:39:10

2

這個錯誤是因爲你試圖 保存相關對象的對象,心不是保存,有兩種選擇:

commit=True

或之前:

for c in request.POST.getlist('color'): 
       car.color.add(c) 

地說:car.save()

如果使用commit=False,該物體是不是beign保存。

但是,你不需要手動保存「顏色」, 做form.save_m2m()會爲你做,那麼,只有當你的窗體有一個 場多對多到最佳的選擇。

編輯:

你的表單中的色域,心不是很好形成,必須是ModelMultipleChoiceField

color = forms.ModelMultipleChoiceField(queryset=Color.objects.all()) 

看到文檔: https://docs.djangoproject.com/en/1.3/topics/forms/modelforms/#inline-formsets

+0

我試圖提交=真這就造成了「違反外鍵約束」 – howtodothis 2012-07-25 04:22:12

+0

形式在您的色域,心不是很好形成,必須是ModelMultipleChoiceField 顏色= forms.ModelMultipleChoiceField(查詢集= Color.objects.all()) https://docs.djangoproject.com/en/1.3/topics/forms/modelforms/#inline-formsets – levi 2012-07-25 04:50:54

4

你正在做form.save(commit=False)在不實際創建記錄在數據庫中,因此無法存儲M2M字段。保存表單後,請執行form.save_m2m()

或者從您的代碼中,您可以在保存car後移動car.color.add()。而且你也不需要有form.save(commit=False)