我有一个将在其整个生命周期内更新的模型。我希望每个更新都返回一个基于旧对象的新对象,而不是更新原始对象。这是为了向用户提供前一个对象作为参考,同时确保它们不会覆盖它。我尝试使用相同的表单,this question建议可以完成我想要的但是没有(它更新了)。然后我尝试覆盖save方法指向我的CreateView,如下面的代码,但这告诉我它需要一个CreateView实例作为它的第一个参数。有没有办法得到我想要的行为?
class TriageUpdateView(PermissionRequiredMixin, UpdateView):
model = Triage
form_class = TriageForm
login_url = "/login/"
permission_required = "myapp.add_triage"
def form_valid(self, form):
obj = form.save(commit = False)
obj.completed_by = self.request.user.person
return TriageCreateView.form_valid(self, form)
答案 0 :(得分:3)
我找到了办法,虽然我不确定这是最好的方法。 Django通过检查主键值来决定是否更新或插入数据库。我在验证中将其设置为None
,这就完成了。
class TriageUpdateView(PermissionRequiredMixin, UpdateView):
model = Triage
form_class = TriageForm
login_url = "/login/"
permission_required = "myapp.add_triage"
def form_valid(self, form):
obj = form.save(commit = False)
obj.pk = None
obj.completed_by = self.request.user.person
return super(TriageUpdateView, self).form_valid(form)
答案 1 :(得分:1)
您的解决方案(pk =无)肯定有效(并且记录为django文档中的一项功能 - 因此它将来也应该推迟),但如果您想手动执行此操作,则可以执行以下操作:
在你的form_valid(self, form)
中,调用一个函数create_new_triage(form.instance, self.request.user.person)
来完成你的工作。 form.incance
保存用户输入的模型的当前实例,您可以在Triage.objects.create()
方法中使用其值。
这为您提供了更多控制权,但如果您只需设置pk = None
即可完成所需操作,我会坚持这一点。