【问题标题】:Added users to Many2many field disappear after click save添加到 Many2many 字段的用户在单击保存后消失
【发布时间】:2019-10-08 09:18:48
【问题描述】:

我尝试将用户添加到 many2many 字段。在单击保存之前,它正在工作。 当我点击保存时它消失了。但是如果我在添加一些额外的元素之前做这个字段,其他元素在点击保存后会保留。

代码:

@api.multi
@api.onchange('partner_id')
def find_projects(self):
    mail_followers = self.env["mail.followers"]
    projects_follower_id = mail_followers.search([('partner_id', '=', self.partner_id.id), ('res_model', '=', 'project.project')])
    projects_list = []
    for x in range(len(projects_follower_id)):
        project_id = self.env["project.project"].search([('id', '=', projects_follower_id[x].res_id), ('active', '=', True)])
        if project_id and project_id not in projects_list:
            projects_list.append(project_id.id)

    self.debug_projects = len(projects_follower_id)
    self.debug_projects2 = projects_follower_id
    self.debug_projects3 = projects_list
    self.project_ids = [[6, 0, projects_list]]

屏幕:

点击保存前的一个元素:

点击保存后:

在点击保存之前手动添加额外元素:

点击保存后手动添加一个元素:

【问题讨论】:

    标签: python odoo odoo-10


    【解决方案1】:

    问题是这个错误:

    https://github.com/odoo/odoo/issues/14761

    在默认视图中它不起作用,当我在视图中添加widget="many2many_tags" 时它开始工作。

    【讨论】:

    • 这意味着命令(6,0,ids)是由这个小部件传递的
    【解决方案2】:

    onchange中,当你想更新many2many的值时不要使用command list,使用RecordSet,我会稍微简化你的代码:

    # don't use api.multi because it's by default multi with onchange, constraints, depends
    @api.onchange('partner_id')
    def find_projects(self):
        # extract followers <RecordsSet>
        projects_followers = self.env["mail.followers"].search([('partner_id', '=', self.partner_id.id), ('res_model', '=', 'project.project')])
        # extract all project ids without duplication <list of int >
        project_ids = projects_followers.mapped('res_id')
        # no need to pass active = True Odoo by default add it
        # search for porject <RecordSet>
        projects = self.env["project.project"]search([('id', 'in', project_ids)])
        # for debuging
        self.debug_projects = len(projects_followers)
        self.debug_projects2 = projects_followers
        self.debug_projects3 = project_ids
    
        # don't use any command by default Odoo detect witch project still in the field
        # and witch one are added when you inspect write you will find that new ones are added 
        # by (4, id)  the ones that were removed are (3, id)
        self.project_ids = projects
    

    编辑:

    当我调查传递给 create 和 write 的字典值时,Odoo 正在将命令转换为仅update 命令,在我通过 ID 为 1,2 的 onchange 事件记录添加之后,字典中的命令是这样的!!:

          'my_many2may' : [[1, 1, {u'name': u'1'}], [1, 2, {u'name': u'2'}]]
    

    在新版本的 Odoo (&gt; 11.0) 中,many2many 传递的命令是替换命令:[(6, 0, ids)] (bug was fixed)

    要在您的情况下解决此问题,只需覆盖 create aand write 以修复您的字段的逗号:

    def _fix_vals(self, vals):
        """ fix bug of ignored record added by onchange event."""
        commands = vals.get('project_ids', [])
        if commands and not any(command[0] == 6 for command in commands):
            vals['project_ids'] +=  [(4, command[1]) for command in commands if command[0] == 1]
    
    
    @api.model
    def create(self, vals):
        self._fix_vals(vals)
        return super(YourClassName, self).create(vals)
    
    
    @api.multi
    def write(self, vals):
        self._fix_vals(vals)
        return super(YourClassName, self).write(vals)
    

    所以基本上当我像这样修复commands时:

        [[1, 1, {u'name': u'1'}], [1, 2, {u'name': u'2'}]]
        # to this
        [(4,1), (4,2), [1, 1, {u'name': u'1'}], [1, 2, {u'name': u'2'}]]
    

    注意:我注意到,当您手动添加记录时,通过了命令 (6,0, ids) 不会出现问题,这就是为什么我在修复它们之前检查了该命令是否存在

    【讨论】:

    • 感谢回复。我使用你的代码,但我仍然有同样的问题。
    • 你的cmets非常有帮助:)
    • @LukaszK 我试图找出原因,只需确认 project_ids 的类型是 many2many?
    • 我找到了问题,这个问题是这样做的:github.com/odoo/odoo/issues/14761 它在默认视图中不起作用,我需要添加小部件。
    • @LukaszK 使用这个小部件我是你的解决方案,但如果你想显示一个树形视图,检查我的编辑问题,当所有记录都从 onchange 事件添加时,命令(6,0, ids) 是没有通过。
    猜你喜欢
    • 2014-11-21
    • 2015-09-02
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    相关资源
    最近更新 更多