我在表单上有3个字段,字段总和为只读。单击“从只读保存数据”字段后,未存储在数据库中。
示例:
class myClass(models.Model):
number_1 = fields.Integer(store=True,default=0)
number_2 = fields.Integer(store=True,default=0)
sum = fields.Integer(store=True)
@api.onchange('number_1','number_2')
def compute_sum(self):
total = self.number_1 + self.number_2
self.sum = total
答案 0 :(得分:3)
在这种情况下,我希望使用计算字段。公式更改不会保存只读字段(例如,发生更改事件时)。在Odoo 11中,为视图中的此行为引入了一个新选项force_save
,但以前的版本没有此选项(社区模块(例如web_readonly_bypass by OCA)除外)。
计算字段的解决方案:
class myClass(models.Model):
number_1 = fields.Integer()
number_2 = fields.Integer()
sum = fields.Integer(compute="compute_sum", store=True)
@api.depends('number_1','number_2')
@api.multi
def compute_sum(self):
for record in self:
total = record.number_1 + record.number_2
record.sum = total
无需更改视图定义。而且,普通store
字段中也不需要Integer
参数。默认值0
已经是Integer
的默认值,因此无需定义它。
您不必在视图readonly
中明确定义sum
,因为默认情况下,不带逆方法的计算字段是只读的。
答案 1 :(得分:0)
我希望下面的代码能对您有所帮助
在我的情况下,“总年”字段为只读字段,并且基于“出生日期”,总年将更新
使用onchange方法,可以获取“合计年”字段,但是当保存该记录时,“合计年”字段设置为空白
解决方案:-
创建总年份的新虚拟字段并将该虚拟字段值设置在原始字段上
示例:-
Python文件
total_year = fields.Float()
total_year_copy = fields.Float()
从日期时间导入日期起
@ api.onchange('dob') def onchange_dob(): 今天= date.today() self.total_year = self.total_year_copy = Today.year-dob.year-(((today.month,Today.day)<(dob.month,dob.day))
@ api.model
def create(self,vals):
如果以数值表示“ total_year_copy”:
vals.update({'total_year':vals.get('total_year_copy')})
返回超级(项目,自我)。创建(值)
@ api.multi
def write(self,vals):
如果以数值表示“ total_year_copy”:
vals.update({'total_year':vals.get('total_year_copy')})
返回super(Project,self).write(vals)
Xml文件
字段名=“ total_year”只读=“ 1”
字段名称=“ total_year_copy”不可见=“ 1”
希望这可以帮助您保存只读记录
最好的问候,
安吉·H·甘地