Django 如何在modelForm中保存实例并更新反向M2M字段
很多问题都涉及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) 创建新作者时,我希望能够为该作者设置发布者。目前,我以以下形式处理此问题
\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)