odoo/openERP one2many fields动态域

2024-05-15 19:21:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我想搜索依赖于其他字段的2个任意字段的记录。
这是我的密码

父类:

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    customer_product_ids = fields.One2many('product.product',
                           compute='_get_partner_products')
    order_line = fields.One2many('sale.order.line', 'order_id')

儿童班:

class SaleOrderLine(models.Model):
    _inherit = 'sale.order.line'

    order_id = fields.Many2one('sale.order')
    product_id = fields.Many2one('product.product')

查看

 <record id="view_ata_sale_order_form_inherit" model="ir.ui.view">
        <field name="name">view.ata.sale.order.form.inherit</field>
        <field name="model">sale.order</field>
        <field name="inherit_id" ref="sale.view_order_form"/>
        <field name="arch" type="xml">
            <field name="partner_id" position="after">
                <field name="partner_channel_id" invisible="1"/>
                <field name="customer_product_ids"/>
            </field>
            <xpath expr="//tree/field[@name='product_id']" position="attributes">
                <attribute name="domain">[('id', 'in', [rec.id for rec in parent.customer_product_ids])]</attribute>
            </xpath>
        </field>
    </record>

默认情况下,客户可以看到定义的所有产品。
在我的情况下,我需要根据客户的选择筛选产品。
每个客户可以有不同的列表产品,或者如果他们没有分类,他们可以看到所有产品

我尝试了上面的代码,但出现了错误:

Uncaught Error: Expected "]", got "(name)"

我想错误来自以下代码:

<attribute name="domain">[('id', 'in', [rec.id for rec in parent.partner_product_ids])]</attribute>

我的问题,
是否可以像上面的代码(在视图中)那样理解python循环?

谢谢你。


Tags: nameinviewididsfieldfieldspartner
3条回答

在您的情况下,您需要使用onchange,并将动态域返回到one2many字段

你应该吃点这样的东西:

@api.onchange('partner')
def onchange_partner(self):
    ids=search for products that have this partner
    then return some thing like this {'domain': {'Many2one or One2many': [('id', 'in', ids)}}

我不会为您编写代码,因此您必须搜索并应用onchange。您可以找到一些信息here

你好,莫斯塔法和亚历山德罗·鲁弗洛

非常感谢您回答我的问题:)(很抱歉您的回答太晚了)

我试过Mostafa Mohamed的解决方案,但它不影响产品列表(它们一直显示所有产品)。
What should onchange methods do and return?

这是我的密码

@api.multi
def onchange_partner_id(self, part):
    res = super(SaleOrder, self).onchange_partner_id(part)
    domain = [('active', '=', True), ('sale_ok', '=', True)]
    if part:
        partner = self.env['res.partner'].browse(part)
        if partner and partner.sales_channel_id:
            domain.append(('sales_channel_ids', '=',
                           partner.sales_channel_id.id))
    product_ids = self.env['product.product'].search(domain)
    res.update(domain={
        'order_line.product_id': ['id', 'in', [rec.id for rec in product_ids]]
    })
    return res  

我尝试了另一种解决方案,所以我在product.product模型中重写了search\u namesearch方法,并且它是有效的。

这里是我的代码,
1) 继承sale_view.xml

<xpath expr="//tree/field[@name='product_id']" position="attributes">
    <attribute name="domain">[
        ('sales_channel_ids', '=', parent.partner_channel_id),
        ('sale_ok', '=', True),
        ('active', '=', True)
    ]</attribute>
    <attribute name="context">{
        'partner_channel_id': parent.partner_channel_id,
        'partner_id': parent.partner_id,
        'quantity': product_uom_qty,
        'pricelist': parent.pricelist_id,
        'uom': product_uom,
        'company_id': parent.company_id
    }</attribute>
 </xpath>   

以及覆盖方法
2) 搜索名称方法:

@api.model
def name_search(self, name, args=None, operator='ilike', limit=100):
    if 'partner_channel_id' in self._context:
        target_domain = findDomain(args, 'sales_channel_ids')
        if len(target_domain) == 1:
            idx = target_domain.keys()[0]
            domain = target_domain.values()[0]
            if False in domain:
                args.pop(idx)
    return super(ProductProduct, self).name_search(name=name,
                                               args=args,
                                               operator=operator,
                                               limit=limit)   

3)搜索方法:

@api.model
def search(self, args, offset=0, limit=None, order=None, count=False):
    if 'partner_channel_id' in self._context:
        target_domain = findDomain(args, 'sales_channel_ids')
        if len(target_domain) == 1:
            idx = target_domain.keys()[0]
            domain = target_domain.values()[0]
            if False in domain:
                args.pop(idx)
    return super(ProductProduct, self).search(args=args,
                                          offset=offset,
                                          limit=limit,
                                          order=order,
                                          count=count)

我在这里要做的是,当他们在上下文和域中检测到“partner_channel_id”时,例如[“sales_channel_id”、“=”、False],我删除了该域并保留其余的域(客户没有channel可以看到所有产品,没有从中筛选产品)。

你不能把这样的代码放进去。我会用另一种方式:

更改产品模型并添加其客户

class Product(models.Model):
    _inherit = 'product.product'

    parent_id = fields.Many2one('res.partner')

然后,可以更容易地更改视图:

<attribute name="domain">[('partner_id', '=', partner_id)]</attribute>

或者

<attribute name="domain">[('partner_id', '=', parent.partner_id)]</attribute>

(取决于您的产品id字段在哪里。。。

相关问题 更多 >