diff --git a/odoo/models.py b/odoo/models.py index 23067ad455acd..9450b1af28591 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -4937,6 +4937,17 @@ def onchange(self, values, field_name, field_onchange): if not all(name in self._fields for name in names): return {} + # filter out keys in field_onchange that do not refer to actual fields + dotnames = [] + for dotname in field_onchange: + try: + model = self.browse() + for name in dotname.split('.'): + model = model[name] + dotnames.append(dotname) + except Exception: + pass + # create a new record with values, and attach ``self`` to it with env.do_in_onchange(): record = self.new(values) @@ -4946,7 +4957,7 @@ def onchange(self, values, field_name, field_onchange): # load fields on secondary records, to avoid false changes with env.do_in_onchange(): - for dotname in field_onchange: + for dotname in dotnames: record.mapped(dotname) # determine which field(s) should be triggered an onchange @@ -4980,7 +4991,7 @@ def onchange(self, values, field_name, field_onchange): record._onchange_eval(name, field_onchange[name], result) # force re-evaluation of function fields on secondary records - for dotname in field_onchange: + for dotname in dotnames: record.mapped(dotname) # determine which fields have been modified @@ -4996,7 +5007,7 @@ def onchange(self, values, field_name, field_onchange): # determine subfields for field.convert_to_onchange() below Tree = lambda: defaultdict(Tree) subnames = Tree() - for dotname in field_onchange: + for dotname in dotnames: subtree = subnames for name in dotname.split('.'): subtree = subtree[name]