需求

因为工作需要,需要判断odoo中的一个字段是否写入有值,如果有值则不可修改,如果没有值则可以修改

失败的做法

  • 假设这个字段是 name

在xml中判断name是否存在,存在则只读

1
<field name="name" attrs="{'readonly':[('name','!=',False)]}"/>

上述做法odoo不生效,name字段有值还是可以修改

一个正确的做法

思路

因为上述判断自己是否有值的做法无法生效,因此采用曲线救国的做法,新增加一个计算字段 track_name 用来追踪 name 值是否存在,如果有返回 ‘1’,如果没有,返回 ‘0’

实际代码

  • 模型
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
track_name = fields.Char(compute='_compute_name')  # 增加计算字段 track_name

@api.onchange('name')  # 追踪 name 的值变化
def _compute_name(self):
	self.ensure_one()
        for record in self:
            if record.name:
                res = '1'
            else:
                res = '0'
            record.track_name = res
  • 前端
1
2
<!-- 判断track_name的值是否是False -->
<field name="name" attrs="{'readonly':[('track_name','!=','0')]}"/>

完成需求,当name字段有值时,track_name字段为True,此时name字段不可修改

注意:此处我写的'0'是字符串,因为我定义的track_name字段是Char类型,如果你定义的是布尔类型,那么请您自己尝试可用的方法