0

我正在检查表中的合作伙伴名称。如果它已经存在,那么我将使用 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() 函数,而不是一一调用。

也许是因为系统速度。请帮我解决这个问题。

4

1 回答 1

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'),
]

另一种管理您想要的方法(但不是很好)是覆盖合作伙伴 ORMcreate方法(这意味着您也应该覆盖 ORMwrite方法):

@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
于 2018-03-22T10:47:55.983 回答