我需要根据搜索结果填充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字段(我看不到视图中的任何更改)。
有人有建议吗?
答案 0 :(得分: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,
}
答案 1 :(得分:2)
此格式是按顺序执行的三元组列表,其中每个三元组是在记录集上执行的命令。并非所有命令都适用于所有情况。可能的命令是:
(0,_,值)
添加根据提供的值dict创建的新记录。
(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列表中集合中的所有现有记录,相当于使用命令5,后跟命令4,用于id中的每个id。不能在One2many上使用。
请注意
上面列表中标记为_的值将被忽略,可以是任何内容, 一般为0或假。
答案 2 :(得分:2)
<强> Many2many 强>
对于many2many字段,预计会有一个元组列表。这是接受的元组列表,带有相应的语义。
(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,[ID])替换链接ID列表(如使用(5)然后(4,ID)ID列表中的每个ID)
详细了解Many2many
default_get :
返回fields_list中字段的默认值。 加载向导/表单时会调用 default_get 方法,您需要覆盖此方法才能执行此操作。
语法:
default_get(self, cr, uid, fields_list, context=None):
参数:
fields_list(list):获取默认值的字段列表(例如[&#39; field1&#39;,&#39; field2&#39;,])
返回:
默认值的字典(在对象模型类上设置,通过用户首选项或在上下文中)
<强>解决方案:强>
最后,您的解决方案将覆盖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 :(得分: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])]
如需更多帮助,请访问many2many field document.