如何根据sale.order中选择的价格表在sale.order.line上的product_id上应用域名过滤器?

时间:2018-03-19 19:31:10

标签: python odoo openerp-7

我在product_id中定义了class sale_order_line,如下所示:

class sale_order_line(osv.osv):
    _inherit = 'sale.order.line'

    def _get_product_ids(self):

        return [('sale_ok', '=', True), ('state', 'in', ['sellable', 'custom']), ('id', '=', )]

    _columns = {
        'product_id': fields.many2one('product.product', 'Product',
                                      domain=_get_product_ids,
                                      change_default=True),
    }

sale.order的表单视图包含以下代码段,其中显示了product_id

 <field name="product_id"
context="{'partner_id':parent.partner_id, 'quantity':product_uom_qty, 'pricelist':parent.pricelist_id, 'shop':parent.shop_id, 'uom':product_uom}"
groups="base.group_user"
on_change="product_id_change(parent.pricelist_id, product_id, product_uom_qty, False, product_uos_qty, False, name, parent.partner_id, False, True, parent.date_order, False, parent.fiscal_position, False, context)"/>

最初在Sale Orders(model: sale.order)我选择pricelist_id字段。然后,我点击“订单行”部分中的“添加项目”以添加销售订单行。在sale.order.line的表单视图中,我只需根据之前选择的product_idpricelist_id中显示产品。

product.product课程中,pricelist_id是一个“虚拟”字段。所以我无法弄清楚如何添加域过滤器,因为它总是会返回空值。

是否可以帮助我帮助我在product_id many2one字段上应用硬过滤器,以便仅显示基于父类中所选pricelist_id的产品?

2 个答案:

答案 0 :(得分:1)

很抱歉,但我无法完全理解你的问题。 您需要根据sale.order中设置的pricelist_id值向sale.order.line的product_id字段添加硬域。 我会引用你的话:

  

我只需要在'product_id'中显示产品   pricelist_id我之前选择了

据我记得在Openerp 7(以及下一个版本)上,您在价目表版本项记录中只有一个product_id字段:这意味着您必须完成此类关系product.pricelistproduct.pricelist.versionproduct.pricelist.item
考虑到每个价格表可能有不同的版本,每个版本都有不同的项目。

我是对的还是我弄错了?这对我来说听起来有点疯狂:)(除非你直接在product.pricelist中创建一些函数字段)。你能更好地解释一下吗?

除此之外,在我看来,您可以使用lambda函数管理字段声明的硬域。这可以让您有机会构建更复杂的域。试一试:

class sale_order_line(osv.osv):
    _inherit = 'sale.order.line'

    def _get_product_ids(self, cr, uid, ids, context=None):
        return [(...), (...)]

    _columns = {
        'product_id': fields.many2one('product.product', 'Product',
             #domain=lambda self: self._get_product_ids(),
             domain=lambda self: self._get_product_ids(self._cr, self._uid, [], self._context),
             change_default=True
         ),                                        
    }

答案 1 :(得分:0)

根据我的理解,你需要依赖下拉许多人。例如,我有两个many2one字段(campus_id和department_id),我们希望在校园字段的基础上更改部门。如果你想这样做,那么下面是代码片段:

1    @api.onchange('campus_id')
2    def _campus_onchange(self):
3        res = {}
4        res['domain']={'department_id':[('campus_id', '=', self.campus_id.id)]}
5        return res