如何在更新视图中使用字段的当前值来更新另一个字段?
我有一个模范员工。它有一个字段day_absent和amount_absent,该字段根据不存在的day_absent显示总扣除额。
在更新视图中,可以设置day_absent。 当我可以返回到DetailView时,说day_absent为1,但是扣减仍然为0。我知道这是因为在save()之前,day_absent仍然为0,并更改为1。所以问题是我该如何计算保存前在day_absent中输入的值是什么?
class PayrollTransactionUpdate(LoginRequiredMixin,UpdateView):
model = t_pay
template_name = 'payroll/transaction/update.html'
fields = ['day_absent']
def post(self,request,pk):
emp = t_pay.objects.get(pk=pk)
emp.amt_absent = emp.day_absent * emp.amt_rate
emp.save()
return super().post(request)
答案 0 :(得分:1)
UpdateView
将对象保存在form_valid()
方法中。使用基于Django类的视图时,请查看this invaluable site。
因此,您应该覆盖form_valid()
方法,而不是post()
方法:
def form_valid(self, form):
emp = form.save(commit=False)
emp.amt_absent = emp.day_absent * emp.amt_rate
emp.save()
self.object = amp
return super().form_valid(form)
请注意,不建议将字段另存为Employee
,而该字段可以很容易地从其他两个字段中计算出来,因为这可能导致数据不一致/损坏。由于amt_absent
只是另外两个字段的乘法,所以为什么需要保存它?
或者,查看您的实际操作,这似乎不是视图的责任。如果应该在每次保存Employee
时发生这种情况,则可以在模型本身上进行此操作:
class Employee(Model):
... # fields go here
def save(self, **kwargs):
self.amt_absent = self._get_amt_absent()
super().save(**kwargs)
# update other models here as well
在这种情况下,您无需覆盖UpdateView
上的任何内容。