在呈现模板之前在 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/')
我将 UpdateView
用作 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/')