我正在检查表格中的合作伙伴名称。如果它已经存在,那么我使用onchange()方法显示一个警告弹出窗口,如下所示:
@api.model
@api.onchange('name','is_exist')
def onchange_displayname(self):
if self.name and self.is_exist is False:
is_name_exist = self.search([('name', '=', self.name)])
if is_name_exist:
self.is_exist = True
raise ValidationError(_('Alread exist'))
else:
pass
但是当我点击“保存”按钮,并尝试创建重复的合作伙伴时。它向我显示了预期的警告弹出窗口,但在后台,伙伴正在保存(调用create()方法)。在我再次点击“保存”按钮之前,我不想保存或创建记录。
注意:它在我的本地系统上运行,但在服务器上运行。此外,一次保存按钮调用onchange()和create()函数,而不是一个接一个。
也许这是因为系统速度。请帮我解决这个问题。
答案 0 :(得分:0)
因此,您有两个字段,一个是name
,另一个是displayname
,您不希望允许与显示名称匹配的名称?如果要阻止用户创建记录,请向合作伙伴模型添加约束:
@api.one
@api.constrains('displayname', 'name', 'is_exist')
def onchange_displayname(self):
if self.displayname and self.is_exist is False:
is_name_exist = self.env['your.partners.model'].search([('name', '=', self.displayname)])
if is_name_exist:
raise ValidationError(_('Alread exist'))
else:
pass
但是,如果你的意思是你唯一想要的就是避免两个拥有相同name
的合作伙伴,你最好用SQL约束并使用UNIQUE
来实现这个功能。在合作伙伴模型中创建它:
_sql_constraints = [
('unique_name', 'unique(name)', 'Alread exist'),
]
管理您想要的内容的另一种方式(但不是很好)是覆盖合作伙伴ORM create
方法(这意味着您也应该覆盖ORM write
方法):
@api.model
def create(self, vals):
partner = super(YourPartnerModel, self).create(vals)
if partner.displayname and partner.is_exist is False:
is_name_exist = self.env['your.partner.model'].search([('name', '=', partner.displayname)])
if is_name_exist:
self.is_exist = True
raise ValidationError(_('Alread exist'))
return partner