Python 存储值(onchange)-新api[Odoo/Openerp]

Python 存储值(onchange)-新api[Odoo/Openerp],python,openerp,odoo-8,Python,Openerp,Odoo 8,我在“sale.order.line”对象中添加了两个字段。假设“field1”和“field2”,它们是只读字段。无论何时更改订单行中的产品,都会显示这两个字段的值 当我选择一个产品时,它会显示两个字段的值,但当保存它时,该值将返回0,而不是存储 这是我的密码: class sale_order_line(models.Model): _inherit = 'sale.order.line' field1 = fields.Float('One') field2 =

我在“sale.order.line”对象中添加了两个字段。假设“field1”和“field2”,它们是只读字段。无论何时更改订单行中的产品,都会显示这两个字段的值

当我选择一个产品时,它会显示两个字段的值,但当保存它时,该值将返回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

这是因为
readonly
模式仅用于显示。在这种情况下,字段中的值不会发送到服务器端

您可以覆盖
sale.order.line
的方法
create
。应该是这样的:

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)

希望这对您有所帮助。

这是因为
只读模式仅适用于显示。在这种情况下,字段中的值不会发送到服务器端

您可以覆盖
sale.order.line
的方法
create
。应该是这样的:

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)

希望这对您有所帮助。

在Odoo框架中,我们现在允许设置只读字段值,并且在createwrite方法中,只读字段将不会进入VAL

所以,如果您在onchange方法中设置这些只读字段值,那么它也不会保留其值,因为它本质上是只读的,不会给您任何错误

目的:定义只读属性的目的是在UI上记录的所有状态下表现相同,用户不能更改其值,主要是为了显示目的而定义。这就是为什么在onchange方法中无法访问只读字段进行编辑

解决方案: 您需要按照以下方式重写CREATEWRITE方法

@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)
更新VAL(记录字典),方法是在调用超级方法之前将这些只读字段设置到字典中,或者在调用超级方法之后更新这些字段

您的问题有另一种解决方案。在Odoo应用程序中,该系统提供的一个模块将在数据库中存储只读值。


在Odoo框架中,我们现在允许设置只读字段值,并且在创建方法和写入方法中,只读字段将不会进入VAL

所以,如果您在onchange方法中设置这些只读字段值,那么它也不会保留其值,因为它本质上是只读的,不会给您任何错误

目的:定义只读属性的目的是在UI上记录的所有状态下表现相同,用户不能更改其值,主要是为了显示目的而定义。这就是为什么在onchange方法中无法访问只读字段进行编辑

解决方案: 您需要按照以下方式重写CREATEWRITE方法

@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)
更新VAL(记录字典),方法是在调用超级方法之前将这些只读字段设置到字典中,或者在调用超级方法之后更新这些字段

您的问题有另一种解决方案。在Odoo应用程序中,该系统提供的一个模块将在数据库中存储只读值。


我如何传递来自方法product\u id\u change的值?@Anonymous101
如果self.product\u id.id:#在这里做某事
我如何传递来自方法product\u id\u change的值?@Anonymous101
如果self.product\u id.id:#在这里做某事