【问题标题】:Force django UpdateView to create an new object instead强制 django UpdateView 创建一个新对象
【发布时间】:2013-10-31 10:10:35
【问题描述】:

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

【问题讨论】:

    标签: django


    【解决方案1】:

    我找到了一种方法,但我不确定这是不是最好的方法。 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)
    

    【讨论】:

      【解决方案2】:

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

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

      这为您提供了更多控制权,但如果您可以通过设置 pk = None 来做您想做的事,我会坚持这样做。

      【讨论】:

        猜你喜欢
        • 2017-02-19
        • 2015-07-26
        • 2018-10-25
        • 2019-09-20
        • 1970-01-01
        • 2017-10-30
        • 2011-06-21
        • 2018-07-18
        • 1970-01-01
        相关资源
        最近更新 更多