强制django UpdateView改为创建一个新对象

时间:2013-10-22 13:40:10

标签: django

我有一个将在其整个生命周期内更新的模型。我希望每个更新都返回一个基于旧对象的新对象,而不是更新原始对象。这是为了向用户提供前一个对象作为参考,同时确保它们不会覆盖它。我尝试使用相同的表单,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)

2 个答案:

答案 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即可完成所需操作,我会坚持这一点。