在呈现模板之前在 UpdateView 中添加工作

Adding work inside UpdateView before template is rendered

我将 UpdateView 用作 。我想扩展下面的 class,以便在呈现 html 页面之前可以执行一些特定于对象的计算。例如,下面的一些伪代码,do_some_calc() 将两个数字相加,结果将存储在 MyModel 的 object/instance 中。

有没有更好的方法?

models.py:

class MyModel(models.Model):
    A = models.FloatField(null=True)
    B = models.FloatField(null=True)
    C = models.FloatField(null=True)

    def do_some_calc(self):
        self.C = self.A + self.B

#

views.py:

class UpdateMyModelView(UpdateView):
    model = MyModel
    template_name='data_form.html'
    fields = ['A', 'B', 'C']

    def get_success_url(self):
        return self.request.POST.get('next', '/default-url/')

get_success_url 是否是执行此操作的正确位置值得商榷。 form_valid 可能是更好的地方。

def form_valid(self, form):
    instance = form.save(commit=False)
    instance.A = instance.B + instance.C
    return super(UpdateMyModelView, self).form_valid(form)    

这样你只保存模型一次。如果你试图在get_success_url中这样做,模型实例已经保存在超级class的form_valid方法中class。

def get_success_url(self):
    # note self.object is the model instance
    self.object.A = self.object.B + self.object.C  
    return self.request.POST.get('next', '/default-url/')