如何使Odoo中onchange字段仅在草稿状态可编辑?
解决Odoo关联onchange字段的只读控制问题
你的问题核心是:onchange方法会绕过视图/字段的只读限制,直接修改字段值,所以仅靠attrs或states设置只读是不够的,必须同时在onchange逻辑里加入状态判断。
解决方案步骤:
- 在Python的onchange方法中添加状态校验:仅当订单处于
draft状态时,才执行字段更新逻辑 - 保留视图的attrs设置:确保前端界面在非草稿状态下字段显示为只读,禁止用户手动修改
修改后的代码:
Python文件
import json from random import randint from odoo import models, fields, api class SaleOrderInherited(models.Model): _inherit = 'sale.order' custom_field = fields.Char( string='Test', store=True, default=lambda self: randint(1, 1000) # 用lambda确保每条新记录生成独立随机值 ) @api.onchange('tax_totals_json', 'date_order') def _onchage_test(self): for record in self: # 仅允许草稿状态下更新字段 if record.state != 'draft': return # 增加空值校验,避免json解析报错 if not record.tax_totals_json: return tax_totals = json.loads(record.tax_totals_json) amount_total = int(tax_totals.get('amount_total', 0)) if amount_total == 0: record.custom_field = randint(1, 1000) else: record.custom_field = f"{amount_total} - {record.date_order}"
XML文件
<odoo> <data> <!--继承销售订单表单视图--> <record id="view_sale_order_custom" model="ir.ui.view"> <field name="name">sale.order.custom.form.inherited</field> <field name="model">sale.order</field> <field name="inherit_id" ref="sale.view_order_form"/> <field name="arch" type="xml"> <xpath expr="//field[@name='partner_id']" position="after"> <!--添加attrs控制只读状态--> <field name="custom_field" attrs="{'readonly': [('state', '!=', 'draft')]}"/> </xpath> </field> </record> </data> </odoo>
关键说明:
- onchange方法的状态判断:Odoo的onchange在前端触发时,不受视图只读属性的限制,必须在方法内部主动判断订单状态,非草稿状态直接返回不执行更新
- default的lambda优化:原代码中
default=randint(1,1000)会在模块加载时仅执行一次,所有新记录的默认值相同,改用lambda可以确保每条新记录生成独立的随机值 - 空值校验:增加
tax_totals_json的空值判断,避免因字段为空导致json解析报错
内容的提问来源于stack exchange,提问作者FMaslina
相关产品推荐
相关产品推荐

