如何根据ids搜索填充many2many字段(向导)

问题描述 投票:0回答:4

我需要根据搜索结果填充many2many(product_product_ids)。例如,我在向导视图(search_test)上定义了一个搜索按钮:

<group>
    <field name="quantity"/>
    <field name="product_product_ids"/>
</group>
 <footer>
    <button name="search_test" type="object" string="Search" class="oe_highlight"/>
       or
    <button string="Cancell" class="oe_link" special="cancel"/>
 </footer>

在向导模型中,我定义了这些字段和函数:

class sale_order_add_balerce(models.TransientModel):
    _name = 'sale.order.add_balerce'
    _description = 'Sale order add balerce'

    _columns = {
    'product_product_ids': fields.many2many('product.product', string='Products'),
    'quantity' : fields.float('Quantity', default='1.0')                
}
    def search_test(self, cr, uid, ids, context=None):
        if context is None:
            context = {}
        product_obj=self.pool.get('product.product')
        #search process
        product_ids_list =  product_obj.search(cr, uid, [], context=context)
        print product_ids_list
        #populating many2many field
        self.write(cr, uid, ids, {'product_product_ids': (6, 0, [product_ids_list])})
        return {
            'res_model': 'product.product',
            'type':'ir.ui.view',
            'context': context, 
            'res_id': ids[0] #open wizard again
        }                

排队

self.write(cr, uid, ids, {'product_product_ids': (6, 0, [product_ids_list])})

我尝试在搜索过程后更新many2many字段,但没有任何反应,也没有看到任何错误 我也尝试过这些变体:

self.write(cr, uid, ids, {'product_product_ids': (0, 0, [product_ids_list])})

self.create(cr, uid,{'product_product_ids': (6, 0, [product_ids_list])})

self.create(cr, uid, ids, {'product_product_ids': (0, 0, [product_ids_list])})

但是,我仍然没有填充我的many2many字段(我在视图中没有看到任何变化)。

有人有建议吗?

python xml many-to-many odoo wizard
4个回答
3
投票

很多2很多

对于多对多字段,需要一个元组列表。这是接受的元组列表,具有相应的语义。

(0, 0, {values}) 链接到需要使用给定值字典创建的新记录

(1, ID, {values}) 用 id = ID 更新链接记录(在其上写入值)

(2, ID) 删除并删除 id = ID 的链接记录(在 ID 上调用 unlink,这将完全删除对象以及指向它的链接)

(3, ID) 切断 id = ID 的链接记录的链接(删除两个对象之间的关系但不删除目标对象本身)

(4, ID) 链接到 id = ID 的现有记录(添加关系)

(5) 取消所有链接(例如对所有链接记录使用 (3,ID))

(6, 0, [IDs]) 替换链接 ID 列表(例如对 ID 列表中的每个 ID 使用 (5) 然后 (4,ID))

查看更多关于 Many2many

default_get

返回 fields_list 中字段的默认值。 加载向导/表单时会调用 default_get 方法,您需要重写此方法才能执行此操作。

语法:

default_get(self, cr, uid, fields_list, context=None):

参数:

fields_list (list) :要获取默认值的字段列表(例如 ['field1', 'field2',])

退货:

默认值的字典(通过用户首选项或在上下文中在对象模型类上设置)

解决方案:

最后你的解决方案是重写default_get方法来设置many2many字段的默认值。

def default_get(self,cr,uid,fields,context=None):
        res = super(sale_order_add_balerce, self).default_get(cr, uid, fields, context=context)
        product_obj=self.pool.get('product.product')
        product_ids_list =  product_obj.search(cr, uid, [], context=context)
        res["product_product_ids"] = [(6,0,[product_ids_list])]
        return res    

3
投票

对于您的方法 search_test(),将返回更改为

return  {
            'name': 'Name for your window',
            'type': 'ir.actions.act_window',
            'view_type': 'form',
            'view_mode': 'form',
            'res_model': 'sale.order.add_balerce',
            'target': 'new',
            'res_id': ids[0],
            'context': context,
        }

2
投票
  • One2many 和 Many2many 使用特殊的“命令”格式来操作存储在字段中/与字段关联的记录集。

此格式是按顺序执行的三元组列表,其中每个三元组是在记录集上执行的命令。并非所有命令都适用于所有情况。可能的命令是:

(0,_,值)

添加根据提供的值字典创建的新记录。

(1,id,值)

用 values 中的值更新 id id 的现有记录。不能在 create() 中使用。

(2,id,_)

从集合中删除id为id的记录,然后将其删除(从数据库中)。不能在 create() 中使用。

(3,id,_)

从集合中移除id为id的记录,但不删除它。不能在 One2many 上使用。不能在 create() 中使用。

(4,id,_)

将 id id 的现有记录添加到集合中。不能在 One2many 上使用。

(5,_,_)

从集合中删除所有记录,相当于在每个记录上显式使用命令 3。不能在 One2many 上使用。不能在 create() 中使用。

(6,_,id)

用 ids 列表替换集合中的所有现有记录,相当于对 ids 中的每个 id 使用命令 5 后跟命令 4。不能在 One2many 上使用。

注意

上面列表中标记为 _ 的值将被忽略,可以是任何值, 一般为 0 或 False。


0
投票

替换此代码

self.write(cr, uid, ids, {'product_product_ids': (6, 0, [product_ids_list])})

self.write(cr, uid, ids, {'product_product_ids': [(6, 0, [product_ids_list])]})

只有你在many2many字段上写id时有语法错误。它将以元组列表作为参数。一般语法是

'many2many_fieldname': [(6, 0, [list_of_ids])] 
© www.soinside.com 2019 - 2024. All rights reserved.