商店价值(onchange) - 新api [Odoo / Openerp]

时间:2016-03-24 12:09:55

标签: python openerp odoo-8

我在'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

2 个答案:

答案 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中,该系统提供的一个模块将在数据库中存储只读值。

Read Only ByPass