为odoo 10设计功能python

时间:2018-11-08 09:25:27

标签: python odoo

我有一个函数,可以使用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

此功能有效,但是我不希望更改字段,除非将字段保存在数据库中而不是之前。

当前,一旦列出的字段之一被填充但未保存在数据库中,这些字段就不会更改

1 个答案:

答案 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。