我有一个函数,可以使用api.onchange()装饰器自动填写许多字段。
@api.onchange('nursery_morning', 'nursery_evening', 'responsible_partner')
def retrieve_responsible_nursery(self):
if self.nursery_morning or self.nursery_evening:
if self.responsible_partner:
if not self.resp_civility1 and not self.resp_name1 and not self.resp_cp1 and not self.resp_num1 \
and not self.resp_address1 and not self.resp_town1 \
and not self.resp_phone1 and not self.resp_phonemobile1:
self.resp_civility1 = self.responsible_partner.title.name
self.resp_name1 = self.responsible_partner.name
self.resp_cp1 = self.responsible_partner.zip_id.name
self.resp_num1 = self.responsible_partner.street_number_id.name
self.resp_address1 = self.responsible_partner.street_id.name
self.resp_town1 = self.responsible_partner.city_id.name
self.resp_phone1 = self.responsible_partner.phone
self.resp_phonemobile1 = self.responsible_partner.mobile
此功能有效,但是我不希望更改字段,除非将字段保存在数据库中而不是之前。
当前,一旦列出的字段之一被填充但未保存在数据库中,这些字段就不会更改
答案 0 :(得分:0)
有两种方法可以解决此问题,如果您只想保留相关记录(responsible_partner)中的值,就可以将这些字段更改为相关字段。
resp_civility1 = fields.Char("Field Label", related="responsible_partner.title.name")
编辑此字段也将编辑链接的记录,因此,如果您根本想更改此值,则不太适合;如果您不希望将其设置为只读,则可以将其设置为只读。从这里编辑。
另一种方法是重写write方法,这将在保存记录时写入值,并且看起来像这样:
@api.multi
def write(self, vals):
res = super(ModelName, self).write(vals)
if vals.get('nursery_morning') or vals.get('nursery_evening') or vals.get('responsible_partner'):
if res.nursery_morning or res.nursery_evening:
if res.responsible_partner:
if not res.resp_civility1 and not res.resp_name1 and not res.resp_cp1 and not res.resp_num1 \
and not res.resp_address1 and not res.resp_town1 \
and not res.resp_phone1 and not res.resp_phonemobile1:
res.resp_civility1 = res.responsible_partner.title.name
res.resp_name1 = res.responsible_partner.name
res.resp_cp1 = res.responsible_partner.zip_id.name
res.resp_num1 = res.responsible_partner.street_number_id.name
res.resp_address1 = res.responsible_partner.street_id.name
res.resp_town1 = res.responsible_partner.city_id.name
res.resp_phone1 = res.responsible_partner.phone
res.resp_phonemobile1 = res.responsible_partner.mobile
return res
这将首先调用模型的write方法,然后将检查是否正在写入三个字段,如果是,它将在onchange方法中运行相同的逻辑。用您已为模型类命名的名称替换ModelName。