You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使Odoo中onchange字段仅在草稿状态可编辑?

解决Odoo关联onchange字段的只读控制问题

你的问题核心是:onchange方法会绕过视图/字段的只读限制,直接修改字段值,所以仅靠attrs或states设置只读是不够的,必须同时在onchange逻辑里加入状态判断。

解决方案步骤:

  1. 在Python的onchange方法中添加状态校验:仅当订单处于draft状态时,才执行字段更新逻辑
  2. 保留视图的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:55:45