gpt4 book ai didi

python - 如何解决 Odoo 中的动态域问题?

转载 作者:太空宇宙 更新时间:2023-11-03 11:42:22 26 4
gpt4 key购买 nike

我创建了一个名为 product.service.type 的新模型。然后,在 product.product 模型中,我还创建了一个 Many2many 字段(名为 service_type,指向 product.service.type 模型)。

现在我有了模型 test,它有 product_idservice_type_id 字段,两个 Many2one 都指向 product.productproduct.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 没有被执行,因此域显示所有服务类型。

您可以在合作伙伴表单中看到相同的问题,字段为 title。创建一个新的合作伙伴,它是一家公司,title 字段的域更改为允许您仅选择 Corp.Ltd. 等记录., 但如果你设置对方为联系人, 你可以在医生, 女士, 小姐等记录中选择. 现在,用你想要的数据保存合作伙伴,然后转到顶部栏的其他菜单。返回合作伙伴表单并打开创建的合作伙伴进行编辑。在不更改 is_company 字段的情况下检查 title 字段。现在您拥有所有可用的头衔,尽管您的合作伙伴属于特定类别(公司或联系人)。

我该如何解决这个问题?

最佳答案

我认为,有以下几点。可以实现。

  • 在 xml 端的 many2many 字段中使用 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 或根据您的要求进行转换。

关于python - 如何解决 Odoo 中的动态域问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47221357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com