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

时间:2017-11-10 11:05:02

标签: python python-2.7 odoo-8 odoo

我创建了一个名为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没有被执行,因此,域显示所有服务类型。< / p>

您可以使用字段title在合作伙伴表单中查看相同的问题。创建一个新的合作伙伴,即公司,title字段的域名更改,以便您只选择 Corp。 Ltd。等记录,但如果您将合作伙伴设置为联系人,则可以选择 Doctor Madam Miss 等记录。现在,保存合作伙伴使用您想要的数据,然后转到顶部栏的其他菜单。返回合作伙伴表单并打开创建的合作伙伴进行编辑。检查title字段,而不更改is_company字段。现在,尽管您的合作伙伴属于特定类别(公司或联系人),但您可以使用所有标题。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我认为,列出以下几点。它可以实现。

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

答案 1 :(得分:0)

在您的模型test上,在您的2个字段旁边,您还需要一个与对象service_type的字段product.product相关的额外数量2。然后将域名提供给您的字段service_type_id

以下是插图

在模型product.product上,你有:

  1. service_type(m2m到product.service.type
  2. 在模型test上,你有:

    1. product_id(m2o到product.product
    2. service_type_id(m2o到product.service.type
    3. available_service_type_ids(与service_type的{​​{1}}相关/计算的m2m)
    4. 在您的xml上,product.product将拥有域service_type_id