【问题标题】:How to populate many2many field based on ids search(wizard)如何根据 ids 搜索填充 many2many 字段(向导)
【发布时间】:2015-09-29 17:28:16
【问题描述】:

我需要根据搜索结果填写 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


    【解决方案1】:

    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, [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    
    

    【讨论】:

      【解决方案2】:

      对于您的方法 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,
              }
      

      【讨论】:

        【解决方案3】:
        • 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, _, ids)

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

        注意

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

        【讨论】:

          【解决方案4】:

          替换此代码

          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.

          【讨论】:

            猜你喜欢
            • 2015-05-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-06
            • 1970-01-01
            • 2020-11-08
            相关资源
            最近更新 更多