Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从updateview更新另一个模型字段_Python_Django - Fatal编程技术网

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

Python 如何从updateview更新另一个模型字段,python,django,Python,Django,如何使用“更新”视图中某个字段的当前值更新另一个字段 我有一个模范员工。它有一个字段day_缺席和amount_缺席,显示基于缺席天数的总扣除金额 在更新视图中,可以设置缺席的日期。 当我可以回到DetailView时,假设你缺席的日期是1。但扣除额仍然是0。我理解这是因为在save()之前,day_缺席仍然是0,并被更改为1。所以问题是,在保存之前,我如何计算在缺少的第_天中输入的值 class PayrollTransactionUpdate(LoginRequiredMixin,Updat

如何使用“更新”视图中某个字段的当前值更新另一个字段

我有一个模范员工。它有一个字段day_缺席和amount_缺席,显示基于缺席天数的总扣除金额

在更新视图中,可以设置缺席的日期。 当我可以回到DetailView时,假设你缺席的日期是1。但扣除额仍然是0。我理解这是因为在save()之前,day_缺席仍然是0,并被更改为1。所以问题是,在保存之前,我如何计算在缺少的第_天中输入的值

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)

UpdateView
将对象保存在
form\u valid()
方法中。查看使用Django基于类的视图时的情况

因此,您应该重写
form\u 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
,因为这可能导致数据不一致/损坏。既然
ament\u缺席
只是其他两个字段的乘积,为什么需要保存它

或者,看看你实际上在做什么,这似乎不是视图的责任。如果假设每次保存
员工时都会发生这种情况,则可以在模型本身上执行此操作:

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

上的任何内容。但是这个模型有很多计算字段。这实际上是我从VisualFoxPro转换的工资系统。请参见()。这只是更新此模型中某些字段的函数之一,还有更多。问题是,如果我把这些字段存储为属性,计算量会很大。那么你推荐什么方法呢?顺便说一句,你的答案很有魅力。非常感谢你,我希望你能帮助我决定这个方法,这是我的第一个django项目,也是编程方面的新项目。如果它有什么意义,我不只是将字段相乘,它将从另一个文件转到一个函数()还有一些情况下我需要更新另一个类。我这样做可以吗。很抱歉问了太多问题,如果我有幸得到建议,这是最后一个问题。我更新了我的答案,看起来这种逻辑属于模型,而不是视图。您应该只在
form\u valid()
中执行与处理来自请求的数据直接相关的操作,例如当前登录的用户或表单数据。视图的作用是将数据传递给模型。模型负责所有的业务逻辑。这是我第一次去参考。但是这种技术更通用,读一本关于MVC(模型-视图-控制器)编程或通用OOP(面向对象编程)的书,真正理解我所说的“关注点分离”。这是关于组织你的代码。