odoo-onchange

本文探讨了在Odoo 13中,如何在字段设置为只读时,通过related、onchange及store属性实现数据关联和计算,并确保数据能被保存至数据库。涉及的方法包括直接关联和模型视图配合的复杂场景。

场景:

当字段被设置为只读时,该字段由其他字段进行改变带出来。常规现象是无法保存到数据库的。

1、实现通过页面某字段数据关联出对应数据表的其他字段的数据;

2、将页面数据进行计算并保存到数据表

相关属性:

onchange + related + readonly + store

实现方法:

方法一、对于直接可以关联过来的字段,采用related 属性将字段属性关联过来,设置readonly=True,并通过store=True进行保存,代码片段如下:

cus_qty_total = fields.Float(string=‘整托数’, digits=(12, 0),
related=‘quotation_id.basic_qty_total’, readonly=True, store=True,)

方法二、对于model中某些字段,不能直接依赖related 进行关联,只能通过onchange进行取数并关联到字段上,处理方法需要model + views配合处理,代码片段如下:

model部分:

quantity = fields.Integer(string='数量', required=True)
unit = fields.Float(string='单价', required=True)
total = fields.Float(string='总价', digits=(12, 2), store=True)

@api.onchange('quantity', 'unit')
    def _onchange_total(self):
        for rec in self:
            rec.total = rec.quantity * rec.unit

views部分:

<field name="total" readonly="1" force_save = "1"/>
出现 `onchange` 无效的情况可能有以下几种原因: 1. 检查 `onchange` 方法是否正确定义,以及是否正确命名。方法名应该以 `onchange_` 开头,其后跟着字段名称。例如,如果你想在 `product_id` 字段上定义 `onchange` 方法,那么方法名应该是 `onchange_product_id`。 2. 检查 `onchange` 方法是否正确绑定到相应的字段上。你应该在相应的字段中使用 `onchange` 属性来绑定定义好的 `onchange` 方法。例如,如果你想在 `product_id` 字段上定义 `onchange` 方法,那么应该在该字段的视图中添加 `onchange` 属性,如下所示: ``` <field name="product_id" on_change="onchange_product_id(product_id)"/> ``` 3. 检查 `onchange` 方法是否正确返回值。`onchange` 方法应该返回一个字典,其中包含要更新的字段和其对应的新值。例如,如果你想在 `product_name` 字段上更新新值,那么可以在 `onchange` 方法中添加以下代码: ``` @api.onchange('product_id') def onchange_product_id(self): if self.product_id: self.product_name = self.product_id.name else: self.product_name = False return {'value': {'product_name': self.product_name}} ``` 这个方法将在 `product_id` 字段值发生变化时被调用,并且将根据选择的产品更新 `product_name` 字段的值。 4. 最后,确保你的模型继承了正确的父类。如果你的模型继承了 `models.Model`,那么你需要添加 `@api.onchange` 装饰器来定义 `onchange` 方法。如果你的模型继承了 `osv.osv`,那么你需要添加 `def onchange_***()` 方法来定义 `onchange` 方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值