我在'sale.order.line'对象中添加了2个字段。假设'field1'和'field2',那些是readonly字段。只要产品在订单行中更改,就会显示2个字段的值。
当我选择一个产品时,它会显示两个字段的值,但保存时,该值将返回0,而不是存储。
这是我的代码:
class sale_order_line(models.Model):
_inherit = 'sale.order.line'
field1 = fields.Float('One')
field2 = fields.Float('Two')
@api.multi
def product_id_change(self, pricelist, product, qty=0,
uom=False, qty_uos=0, uos=False, name='', partner_id=False,
lang=False, update_tax=True, date_order=False, packaging=False, fiscal_position=False, flag=False):
res = super(sale_order_line, self).product_id_change(pricelist, product, qty,
uom, qty_uos, uos, name, partner_id,
lang, update_tax, date_order, packaging, fiscal_position, flag)
if product:
one = self.search([('product_id', '=', product), ('partner_id', '=', partner_id)])
two = self.search([('product_id', '=', product), ('partner_id', '!=', partner_id)])
if customer:
field1 = one[-1]
res['value']['field1'] = field1
if other:
field2 = two[-1].
res['value']['field2'] = field2
return res
答案 0 :(得分:0)
这是因为readonly
模式仅适用于显示。在这种情况下,字段中的值不会发送到服务器端。
您可以覆盖create
的方法sale.order.line
。它应该是这样的:
class sale_order_line(models.Model):
_inherit = 'sale.order.line'
@api.model
def create(self, vals):
# just example
vals[u'field1'] = 2.03
vals[u'field2'] = 3.05
return super(sale_order_line, self).create(vals)
希望这会对你有所帮助。
答案 1 :(得分:0)
在Odoo框架中,我们现在允许设置只读字段值,并且只读字段不会进入创建和写入 val 强>方法。
因此,如果您在onchange方法中设置这些只读字段值,那么它也不会保留它的值,因为从本质上来说它只是读取,它不会给您带来任何错误。
目的:定义只读属性的目的是通过UI上记录的所有状态来表现相同,用户不能更改它的值,主要是为了显示目的而定义。这就是为什么在onchange方法中无法访问只读字段的原因。
您需要按以下方式覆盖 CREATE 或 WRITE 方法。
@api.model
def create(self, vals):
######
# WRITE YOUR LOGIC HERE AND BRING THOSE VALUE INTO VARIABLE AND THEN UPDATE IT IN VALS
VARIABLE_1 = SEARCH YOUR DATA
VARIABLE_2 = SEARCH YOUR DATA
vals.update({field1' : VARIABLE_1, 'field_2' : VARIABLE_2})
return super(sale_order_line, self).create(vals)
通过在调用super方法之前将那些只读字段设置为字典来更新vals(记录字典),或者在调用super方法之后更新这些字段。
您的问题有另一种解决方案。在Odoo Apps中,该系统提供的一个模块将在数据库中存储只读值。