如何从updateview更新另一个模型字段

时间:2019-04-11 14:13:26

标签: python django

如何在更新视图中使用字段的当前值来更新另一个字段?

我有一个模范员工。它有一个字段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)

1 个答案:

答案 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上的任何内容。