2

我有一个模型将在其整个生命周期内更新。我希望每次更新都基于旧对象返回一个新对象,而不是更新原始对象。这是为了给用户以前的对象作为参考,同时确保他们不会覆盖它。我尝试使用相同的表格,这个问题建议可能会完成我想要的,但它没有(而是更新了)。然后我尝试重写 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)
4

2 回答 2

4

我找到了一种方法,但我不确定这是不是最好的方法。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)
于 2013-10-22T14:32:09.557 回答
1

您的解决方案(pk = None)绝对有效(并且在 django 文档中记录为一个功能 - 因此它应该在将来也可以使用),但如果您想手动执行此操作,您可以执行以下操作:

在你的form_valid(self, form), 调用一个函数create_new_triage(form.instance, self.request.user.person)来完成你的工作。form.incance保存用户输入的模型的当前实例,您可以在Triage.objects.create()方法中使用它的值。

这给了你更多的控制权,但如果你可以通过设置来做你想做的事pk = None,我会坚持下去。

于 2013-10-23T20:23:00.730 回答