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

时间:2016-09-16 23:26:10

标签: django django-class-based-views

我正在使用UpdateView作为discussed here。我想扩展下面的类,以便在呈现html页面之前执行一些特定于对象的计算。例如,下面的一些虚拟代码do_some_calc()将添加两个数字,结果将存储在MyModel的对象/实例中。

有首选方法吗?

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/')

1 个答案:

答案 0 :(得分:2)

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中执行此操作,则模型实例已保存在超类的form_valid方法中。

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/')