Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何在modelForm中保存实例并更新反向M2M字段_Django_Django Models_Django Forms - Fatal编程技术网

Django 如何在modelForm中保存实例并更新反向M2M字段

Django 如何在modelForm中保存实例并更新反向M2M字段,django,django-models,django-forms,Django,Django Models,Django Forms,很多问题都涉及M2M关系之前的保存实例,但是我在通过带有\u set关系的表单保存时遇到了一个问题,其他答案中似乎没有涉及到这一点 我有两个M2M关系的型号: class Author(models.Model): name = models.CharField() class Publisher(models.Model): authors = models.ManyToManyField(Author) 创建新作者时,我希望能够为该作者设置发布者。目前,我以以下形式处理此问题

很多问题都涉及M2M关系之前的保存实例,但是我在通过带有
\u set
关系的表单保存时遇到了一个问题,其他答案中似乎没有涉及到这一点

我有两个M2M关系的型号:

class Author(models.Model):
   name = models.CharField()

class Publisher(models.Model):
   authors = models.ManyToManyField(Author)
创建新作者时,我希望能够为该作者设置发布者。目前,我以以下形式处理此问题:

class AuthorForm(forms.ModelForm):
    publishers = forms.ModelMultipleChoiceField(queryset=Publisher.objects.all())

    def __init__(self, *args, **kwargs):
        super(AuthorForm, self).__init__(*args, **kwargs)

        # If the form is used in a UpdateView, set the initial values
        if self.instance.id:
            self.fields['publishers'].initial = self.instance.publisher_set.all(
            ).values_list('id', flat=True)

    def save(self, *args, **kwargs):
        instance = super(AuthorForm, self).save(*args, **kwargs)

        # Update the M2M relationship
        instance.issuer_set.set(self.cleaned_data['issuers'])

        return instance

    class Meta:
        model = Author
        fields = ['name', 'publishers']
在更新现有作者时,此操作非常有效。但是,当我使用它创建一个新的时,我得到:

在使用此多对多关系之前,需要为字段“id”设置一个值

我理解这是因为需要首先保存实例,但是在
def save()
中我正在这样做(
instance=super(AuthorForm,self).save(*args,**kwargs)


我哪里出错了?

调用
super
不能保证它会创建一个实例。因为表单的方法有一个名为
commit
的参数,如果调用
save
的方法正在传递
commit=False
(例如:
form.save(commit=False)
),则它不会保存实例。所以您需要显式地保存它。像这样:

instance = super(AuthorForm, self).save(commit=True)