Openerp 中的 readonly
-
关于 OE 中 readonly 属性,其 本质跟我们平常 的定义有些许 不同,它直接就 禁止了form界面中的字段值写入到数据库。
我们常用(至少我常用)的 readonly 字段,往往是希望,该字段的数值 是由程序产生和赋值,禁止人工修改,但是 这个值是需要写入到数据库的,
但我们的愿望跟 OE 的处理是不一样的。
这里有以前的讨论:
【求助】如何实现添加采购明细时,采购员不能修改采购单价?<br / [检测到链接无效,已移除] br />
今天在群里问了众位大牛,恕不一一列名了
给出了几个方法,我自己尝试了一个感觉 较简单的,
就是方法1 , 在 意图 只读的字段 也定义一个 onchange 函数,该函数直接使用 计算该字段值的 onchange,
这样修改后,就会 自动强行再计算一遍,又是我们希望的数值了。<br /> <field name="metric_spec" on_change="onchange_metric_spec(metric_spec,stratify_base,nwtid)" /><br /> <field name="input_type"/><br /><br /> <field name="product_id" on_change="onchange_metric_spec(metric_spec,stratify_base,nwtid)" /><br /><br />
方法2,
我自己还尝试了一个 比较 暴力的方法, 用 domain 将该字段的值 限定在其自身。
但是 这方法 似乎不通用,非引用值 的 字段可以吗?<br /> 'product_id': fields.many2one('product.product', u'对应产品',<br /> domain="[('id', '=', product_id)]"<br /> ),<br />
方法3:
就是重载model的 write 函数,重新计算一次 只读字段的值,并加入到 vals 中,使之写入。 感觉为了一个 只读,涉及多处改写,有点麻烦.
但是 这个 用户体验是比较好的,跟我们 平常的只读逻辑一样。只是在界面 处理后数据保存时 计算了两次
方法4, 这是 我最希望 完成的方法, 就是 改变Oe 的处理逻辑,
webclient 传递到 server 数据中,能包含 readonly 的值,而不是直接忽略。
哪位能 指点 一二 ? -
为什么不把需要只读但是需要内部计算的字段定义成function field呢?
就象‘产品’对象的incoming, outgoing字段,其值是动态变化的,但是对用户是只读的,它们都是function字段