在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的产品。
答案 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。