域在Many2one字段上

时间:2018-08-07 13:44:58

标签: odoo odoo-10 odoo-9 odoo-11

在purchase.order模型中调用onchange方法之后,我需要在purchase.order.line模型中的字段product_id上有applay域。

示例:

_inherit = "purchase.order"

custom_id = fields.Many2one('custom.model', string='Custom') 

@api.onchange('custom_id')
def change_product(self):
    lst = [1,2,3]
    return {'domain': {'order_id.product_id': [('id', 'in', lst)]}}

这是我要在其中添加域的原始字段

product_id = fields.Many2one('product.product', string='Product',domain=[('purchase_ok', '=', True)], change_default=True, required=True)

我没有收到任何错误,但是在product_id字段中显示了数据库中的所有数据,而不是上面示例中ID为1,2,3的产品。

2 个答案:

答案 0 :(得分:0)

为product_id(而不是custom_id)编写onchange函数,然后返回域。

@api.onchange('product_id')
def change_product(self):
    lst = [1,2,3]
    return {'domain': {'product_id': [('id', 'in', lst)]}}

在onchange函数内部,请考虑custom_id。

答案 1 :(得分:0)

您在这里有一个小问题:您无法为儿童关系IIRC设置域。

您可以做的是在子关系(此处为purchase.order.line上创建一个相关字段,并触发该onchange。

class PurchaseOrder(models.Model):
    _inherit = "purchase.order"

    custom_id = fields.Many2one(
        comodel_name='custom.model', string='Custom')

class PurchaseOrderLine(models.Model):
    _inherit = "purchase.order.line"

    custom_id = fields.Many2one(
        comodel_name="custom.model", related="order_id.custom_id")

    @api.onchange('custom_id')
    def onchange_custom_id(self):
        lst = [1,2,3]
        return {'domain': {'product_id': [('id', 'in', lst)]}}

还有更多信息。让我假设您为产品变式(a)或产品类别(b)设置了custom_id。只需更改product_id的域并使用域运算符'=?'。您不需要此解决方案的onchange方法,但必须在视图中定义custom_id(可能是不可见的,这对于完整的第一个解决方案也是必须的)!

(a)

class PurchaseOrderLine(models.Model):
    _inherit = "purchase.order.line"

    custom_id = fields.Many2one(
        comodel_name="custom.model", related="order_id.custom_id")
    product_id = fields.Many2one(
        domain="[('purchase_ok', '=', True), ('custom_id', '=?', custom_id)]")

(b)

class PurchaseOrderLine(models.Model):
    _inherit = "purchase.order.line"

    custom_id = fields.Many2one(
        comodel_name="custom.model", related="order_id.custom_id")
    product_id = fields.Many2one(
        domain="[('purchase_ok', '=', True), ('categ_id.custom_id', '=?', custom_id)]")

如果未设置custom_id,则域将显示为:产品必须可购买且为True。