如何在保存按钮上停止执行create()方法?

时间:2018-03-22 10:44:06

标签: python python-2.7 odoo-10 odoo-9 odoo-11

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

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

1 个答案:

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