我正在使用CBVViewView向用户显示几个带有表单集的页面。
当一个给定的formset/mysql View背后的模型是一个公共的模型时(稍后会更清楚),在视图上使用以下逻辑一切都可以正常工作:
class Create(CreateView):
...
def form_valid(self, formset):
instances = formset.save(commit=False)
for instance in instances:
instance.user = self.request.user
instance.save()
return super(Create, self).form_valid(formset)
字符串
然而,在其中一个模型上,我必须向模型保存()方法添加额外的操作。也就是说,我需要在保存父对象时创建子对象。类似于:
class Parent(models.Model):
...
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
self.child_set.create(...., *args, **kwargs)
型
在这个特殊的例子中,子对象被创建了两次,我相信formset.save(commit=False)是罪魁祸首。
我尝试将child_set.create()替换为
child = Child(...parameters, parent=self)
child.save(*args, **kwargs)
型
但结果是一样的。我怎么才能避免呢?
1条答案
按热度按时间d7v8vwbk1#
CreateView
[Django-doc]的**.form_valid(…)
**方法[Django-doc]将在form
上调用.save()
,这将调用新一轮保存所有对象。您可以设置示例的
.user
,然后让CreateView
保存这些示例。这意味着您可以将其实现为:字符串
也就是说,使用**
.get_or_create(…)
[Django-doc]可能比使用.create(…)
**[Django-doc]更好,因为现在您将在每次保存Parent
对象时创建一个Child
对象,这可能不是预期的效果。