5

color次の形式(多対多のフィールド)でCheckboxSelectMultipleウィジェットからの値を入力する方法を知りたいです。

#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('/')

#エラー

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

3 に答える 3

4

form.save(commit=False)DBに実際にレコードを作成せず、M2Mフィールドを保存できないために行っています。form.save_m2m()フォームを保存した後に行います。

car.color.add()または、コードから、を保存した後に移動できますcar。また、持つ必要はありませんform.save(commit=False)

于 2012-07-25T04:20:24.867 に答える
3

チェックボックスが表示されないのですか、それとも取り除こうとしているエラーですか?後者の場合はcommit=False、フォームを保存するときにを削除してみてください。

更新:Colorモデルはフィールドを指定していません。1つ与えてください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

于 2012-07-25T04:15:14.810 に答える
2

このエラーは、保存されていないオブジェクトに関連オブジェクトを保存しようとしているために発生します。次の 2 つのオプションがあります。

置くcommit=True

または前:

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

置く: car.save()

を使用するcommit=Falseと、そのオブジェクトは保存されません。

ただし、「色」を手動で保存する必要はありform.save_m2m()ません。フォームに選択するフィールドが多数ある場合にのみ、手動で保存する必要があります。

編集:

フォーム内の色フィールドは整形式ではありません。ModelMultipleChoiceField である必要があります

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

ドキュメントを参照してください: https://docs.djangoproject.com/en/1.3/topics/forms/modelforms/#inline-formsets

于 2012-07-25T04:18:53.693 に答える