我有一个与另一个模型具有多对多关系的模型。它们都有与之关联的表单,后者有一个表单集。
class Foo(models.Model):
name = models.CharField(max_length=20)
bars = models.ManyToManyField("Bar",blank=True,null=True)
class Bar(models.Model):
name = models.CharField(max_length=20)
class FooForm(ModelForm):
class Meta:
model = Foo
class BarForm(ModelForm):
class Meta:
model = Bar
BarFormSet = modelformset_factory(Bar,form=BarForm,extra=2)
在我的视图/模板中,标准的 ManyToManyField 小部件已替换为表单集。因此,我必须手动将该表单集中指定的 Bar 实例与 Foo 的 ManyToManyField 相关联。我在 Foo 的 clean 方法中这样做:
def clean(self,*arg,**kwargs):
cleaned_data = self.cleaned_data
# barSubFormInstance is the BarSubForm that is displayed in my view
if barFormSetInstance.is_valid():
barInstances = barFormSetInstance.save()
cleaned_data["bars"] = barInstances
return cleaned_data
这几乎可以工作。问题在于它将 Foo.bars 设置为表单集中已更改的表单集。因此,如果我向我的 foo 添加一个 bar,然后重新加载表单并添加第二个 bar,则 foo 最终只有第二个 bar。
根据 Django 文档:
save() 方法返回已保存到数据库的实例。如果给定实例的数据在绑定数据中没有变化,则该实例不会保存到数据库中,也不会包含在返回值中...
所以我明白为什么我的代码失败了。我只是不知道该怎么办。我可以传递什么给cleaned_data["bars"] 以添加新修改的表单但不删除现有表单?
非常感谢您的帮助。