如何根据 ids 搜索(向导)填充 many2many 字段
How to populate many2many field based on ids search(wizard)
我需要一个根据搜索结果填充的 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 字段仍然没有被填充(我在视图中没有看到任何变化)。
有人有什么建议吗?
替换此代码
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])]
如需更多帮助,您可以访问 many2many field document.
- One2many 和 Many2many 使用特殊的 "commands" 格式来操作存储 in/associated 字段的记录集。
此格式是按顺序执行的三元组列表,其中每个三元组是对记录集执行的命令。并非所有命令都适用于所有情况。可能的命令是:
(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, _, ids)
用 ids 列表替换集合中的所有现有记录,相当于对 ids 中的每个 id 使用命令 5 后跟命令 4。不能在 One2many 上使用。
Note
Values marked as _ in the list above are ignored and can be anything,
generally 0 or False.
多对多
对于 many2many 字段,需要一个元组列表。这是接受的元组列表,具有相应的语义。
(0, 0, { values }) link 到需要使用给定值字典创建的新记录
(1, ID, { values }) 使用 id = ID 更新 linked 记录(在其上写入值)
(2, ID) 移除并删除 ID = ID 的 linked 记录(调用 unlink ID,将删除完全反对,link 也反对)
(3, ID) 将link 剪切到id = ID 的linked 记录(删除两个对象之间的关系但不不删除目标对象本身)
(4, ID) link 到 id = ID 的现有记录(添加关系)
(5) unlink 全部(比如对所有 linked 记录使用 (3,ID))
(6, 0, [IDs]) 替换 linked ID 列表(比如对每个 ID 使用 (5) 然后 (4,ID)在 ID 列表中)
查看更多关于 Many2many
default_get :
Returns fields_list 中字段的默认值。
default_get 方法在您的 wizard/form 加载时调用,您需要覆盖此方法才能执行此操作。
语法:
default_get(self, cr, uid, fields_list, context=None):
参数:
fields_list (list) :要获取默认值的字段列表(例如 ['field1'、'field2'、])
Returns:
默认值字典(在对象模型 class 上设置,通过用户首选项或在上下文中设置)
解法:
最后,您的解决方案是覆盖 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
对于您的方法 search_test(),将 return 更改为
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,
}
我需要一个根据搜索结果填充的 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 字段仍然没有被填充(我在视图中没有看到任何变化)。
有人有什么建议吗?
替换此代码
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])]
如需更多帮助,您可以访问 many2many field document.
- One2many 和 Many2many 使用特殊的 "commands" 格式来操作存储 in/associated 字段的记录集。
此格式是按顺序执行的三元组列表,其中每个三元组是对记录集执行的命令。并非所有命令都适用于所有情况。可能的命令是:
(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, _, ids)
用 ids 列表替换集合中的所有现有记录,相当于对 ids 中的每个 id 使用命令 5 后跟命令 4。不能在 One2many 上使用。
Note
Values marked as _ in the list above are ignored and can be anything, generally 0 or False.
多对多
对于 many2many 字段,需要一个元组列表。这是接受的元组列表,具有相应的语义。
(0, 0, { values }) link 到需要使用给定值字典创建的新记录
(1, ID, { values }) 使用 id = ID 更新 linked 记录(在其上写入值)
(2, ID) 移除并删除 ID = ID 的 linked 记录(调用 unlink ID,将删除完全反对,link 也反对)
(3, ID) 将link 剪切到id = ID 的linked 记录(删除两个对象之间的关系但不不删除目标对象本身)
(4, ID) link 到 id = ID 的现有记录(添加关系)
(5) unlink 全部(比如对所有 linked 记录使用 (3,ID))
(6, 0, [IDs]) 替换 linked ID 列表(比如对每个 ID 使用 (5) 然后 (4,ID)在 ID 列表中)
查看更多关于 Many2many
default_get :
Returns fields_list 中字段的默认值。 default_get 方法在您的 wizard/form 加载时调用,您需要覆盖此方法才能执行此操作。
语法:
default_get(self, cr, uid, fields_list, context=None):
参数:
fields_list (list) :要获取默认值的字段列表(例如 ['field1'、'field2'、])
Returns:
默认值字典(在对象模型 class 上设置,通过用户首选项或在上下文中设置)
解法:
最后,您的解决方案是覆盖 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
对于您的方法 search_test(),将 return 更改为
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,
}