Odoo10中修改发票利润率计算逻辑后触发NameError: global name 'amount_total' is not defined错误的解决咨询
Odoo10中修改发票利润率计算逻辑后触发NameError: global name 'amount_total' is not defined错误的解决咨询
问题分析
你碰到的这个NameError其实很好定位:代码里直接写了amount_total,但它并不是全局变量,而是account.invoice模型自带的字段,必须通过当前的发票记录实例来访问才行。
看你代码里触发错误的这一行:
margin_percentage = (line_margin_amount / amount_total) * 100
这里的amount_total没有绑定到具体的发票对象,Python找不到这个变量,自然就报错了。
修复方案
只需要把amount_total改成record.amount_total就可以解决这个问题——因为循环里的record就是当前处理的发票实例,它包含了amount_total字段的具体值。另外还有个小细节要注意:你最后一行的字符串拼接少了一个闭合的单引号,也得补上。
修正后的关键代码片段:
if line_cost: # 通过record实例访问发票的总金额字段 margin_percentage = (line_margin_amount / record.amount_total) * 100 else: margin_percentage = 100 record.margin_amount = line_margin_amount # 补上缺失的闭合单引号 record.margin_percentage = str(round(margin_percentage,2)) + '%'
额外优化建议
你用了@api.one装饰器,其实不需要再写外层的for record in self:循环——@api.one会自动把self处理成单个记录,这样代码可以更简洁,也符合Odoo的API规范:
@api.one @api.depends('amount_total','invoice_line_ids','invoice_line_ids.quantity','invoice_line_ids.price_unit', 'invoice_line_ids.discount') def _get_average_margin_percentage(self): sale_price = discount = cost = margin_amount = 0.0 line_cost = line_margin_amount = margin_percentage = 0.0 if self.invoice_line_ids: for line in self.invoice_line_ids: sale_price = line.price_unit * line.quantity discount = (sale_price * line.discount)/100 cost = line.product_id.standard_price * line.quantity line_cost += cost margin_amount = (sale_price - discount) - cost line_margin_amount += margin_amount if line_cost: margin_percentage = (line_margin_amount / self.amount_total) * 100 else: margin_percentage = 100 self.margin_amount = line_margin_amount self.margin_percentage = str(round(margin_percentage,2)) + '%'
备注:内容来源于stack exchange,提问作者Wimpy




