我创建了一个名为product.service.type的新模型.然后,在product.product模型中,我还创建了一个Many2many字段(名为service_type,指向product.service.type模型).
现在我进行了模型测试,其中包含product_id和service_type_id字段,Many2one分别指向product.product和product.service.type.
我想要的是,如果您选择产品,服务类型域将更改为仅显示所选产品的服务类型.我通过onchange来管理这个:
def onchange_product_id(self, cr, uid, ids, product_id, context=None):
if product_id:
product = self.pool.get('product.product').browse(
cr, uid, [product_id], context=context)
service_type_ids = product.service_type.mapped('id')
return {
'domain': {
'service_type_id': [('id', 'in', service_type_ids)],
},
}
这很有效,问题是当您编辑记录(而不是创建新记录)时,因为在这种情况下onchange没有被执行,因此,域显示所有服务类型.
您可以使用字段标题在合作伙伴表单中查看相同的问题.创建一个新的合作伙伴,这是一个公司,标题字段的域名更改,以允许您只选择像有限公司等的记录,但如果你设置合作伙伴是一个联系人,你可以选择像医生, Madam,Miss等.现在,使用您想要的数据保存合作伙伴,然后转到顶部栏的其他菜单.返回合作伙伴表单并打开创建的合作伙伴进行编辑.检查标题字段而不更改is_company字段.尽管您的合作伙伴属于特定类别(公司或联系人),但现在您可以使用所有标题.
我怎么能解决这个问题?
解决方法:
我认为,列出以下几点.它可以实现.
>在many2many字段xml端更新带有product_id的上下文.
>覆盖产品服务类型模型的search()方法
>检查是否收到相同的上下文并触发逻辑,否则返回super()方法
例如:
@api.model
def search(self, args, offset=0, limit=None, order=None, count=False):
context = self._context or {}
# Display product list which has not included in CofA Template
if context.get('product_service_id'):
product = self.env['product.product'].browse(context.get('product_service_id'))
service_type_ids = product.service_type.mapped('id')
args += [('service_type_id', 'not in', service_type_ids)]
return super(ProductServiceType, self).search(args,
offset,
limit,
order,
count=count)
在XML方面:
<field name="product_id"/>
<field name="many2many_field" context="{'product_service_id': product_id}">
注意:我已尝试按照新API进行回答,但尚未对其进行测试.您需要使用旧API或根据您的要求进行转换.