将用户添加到Many2many的字段在单击保存后消失

问题描述 投票:1回答:2

我尝试将用户添加到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]]

屏幕:

单击保存之前的一个元素:

enter image description here

单击保存后:

enter image description here

单击保存之前,手动添加其他元素:

enter image description here

单击保存后,添加一个手动添加的元素:

enter image description here

python odoo odoo-10
2个回答
1
投票

问题是此错误:

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

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


0
投票

onchange中,当您想更新command list的值时,不要使用many2many,请使用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

编辑:

[当我调查传递给创建和写入的字典值时,Odoo将命令转换为仅update命令,在我添加了ID为1,2的onchange事件记录后,字典中的命令就是这样!:] >

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

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

要在您的情况下解决此问题,只需覆盖create和编写以修复您所在领域的逗号:

def _fix_vals(self, vals):
    """ fix bug of ignored record added by onchange event."""
    commands = vals.get('project_ids', [])
    if commands and all(command[0] != 6 for command in commands):
        # make sure the record updated are added first 
        append_commonds  = [(4, command[1]) for command in commands if command[0] == 1]
        vals['project_ids'] = append_commonds + commands


@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)

基本上,当我这样改变公地时:

    [[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)通过了,问题不会出现,这就是为什么我在修复它们之前检查该命令是否存在的原因
© www.soinside.com 2019 - 2024. All rights reserved.