首页 > 解决方案 > 动态域在odoo9中不能正常工作

问题描述

在 Odoo9 中,我需要一个依赖于many2one向导字段的动态域。使用各种示例,我使它工作,但过滤后的值对于前一个选项始终有效。或者,如果我从过滤的域中选择(无效)选项,它们是有效的。

细节:

在机会工作流程结束时,推销员应该评估他/她选择成功概率的机会。在特殊向导中有几个级别可供选择(“100% 确定”、“不确定”、“也许”等)。我用fields.Selection这个。然后我介绍了一种新的机会类型(保留),其中应该只有 100% 和 0% 可用。所以我创建了一个新模型evaluation_option,用这些值替换fields.Selectionfields.Many2one过滤掉允许的选项(用retention=True)。

这是我的向导模型:

class evaluation_wizard(models.TransientModel):
    _name = 'evaluation.wizard'
    _description = 'Wizard to evaluate opportunity'

    lead_id = fields.Many2one('crm.lead')
    evaluation_option_id = fields.Many2one('evaluation.option')

    def get_object(self, model, fieldname):
        ids = self._context.get(fieldname)
        if ids is None:
            ids = self._context.get('default_' + fieldname)
        return self.env[model].browse(ids)

    @api.onchange('lead_id')
    def _onchange_lead_id(self):
        # I check the context to get lead_id
        lead_id = self.lead_id if self else self.get_object('crm.lead', 'lead_id')
        dom = [('retention', '=', True)] if lead_id.retention else []
        return {'domain': {'evaluation_option_id': dom}}

这是真正的向导

    <record id="evaluation_wizard_view" model="ir.ui.view">
        <field name="name">evaluation.wizard.view</field>
        <field name="model">evaluation.wizard</field>
        <field name="arch" type="xml">
            <form string="Evaluate opportunity">
                <sheet class="row">
                    <group>
                        <group>
                            <field name="lead_id" invisible="False"/>
                            <field name="evaluation_option_id" required="True"
                                   create="False" edit="False" widget="radio"
                            />
                        </group>
                    </group>
                    <footer>
                        <button name="evaluate"
                                type="object"
                                string="Confirm"
                                class="oe_highlight"
                                context="{'lead_id': default_lead_id,
                                          'active_id': default_lead_id,
                                          'evaluation_option_id': evaluation_option_id}"/>
                    </footer>
                </sheet>
            </form>
        </field>
    </record>

我为域的动态更改创建了一个 onchange 方法,如上所示。我也尝试像这样计算域: evaluation_option_id = fields.Many2one('evaluation.option', domain=_compute_domain)wherecompute_domain与 onchange 的方法相同,但用api.depends. 这些方法都没有按预期工作。

我通过按钮上的上下文使用带有值(例如lead_id)预填充默认值( )的瞬态模型。default_lead_id

无论我尝试什么,当我使域实际工作时,它都会过滤掉这些值,但对于之前的选择总是有效的。这意味着如果我选择保留机会,我将获得所有选项,如果我随后选择正常机会,我将获得保留选项。如果下一个是常规机会,则选项是正确的。但是,如果我选择保留机会(并显示无效选项),然后选择无效选项,则无效选项会突然过滤掉。我不确定,但在我看来,这里提到了同样的问题:odoo 中 many2one 字段的域过滤器?在接受答案的最后评论中。

你能看到一个明显的错误,或者你知道如何动态更改域的另一种方法吗?

- 编辑:

我最终设法使它工作。我不记得一年前我到底做了什么,但是旧版本和当前版本的代码之间的比较显示了这一点:

1)我更新了 get_object 方法以直接从表单中获取lead_id,然后如果不成功,请尝试从上下文中挖掘它。

def get_object(self, model, fieldname):
    value = getattr(self, fieldname, None)
    if value is not None:
        return value
    ids = self._context.get(fieldname, None)
    if ids is None:
        ids = self._context.get('default_' + fieldname)
    ids = [] if ids is None else ids
    return self.env[model].browse(ids)


@api.onchange('lead_id')
def _onchange_lead_id(self):
    lead_id = self.get_object('crm.lead', 'lead_id')
    dom = [('retention', '=', True)] if lead_id.is_retention_opp else []
    return {'domain': {'evaluation_option_id': dom}}

2) 另一个更改是在 xml 中 - 只读lead_id(以便在呈现向导时只调用一次)并从以下位置删除无线电小部件evaluation_option_id

<group>
    <field name="lead_id" invisible="True" readonly="True"/>
    <field name="evaluation_option_id" required="True"
           options="{'no_create': True}"/>
</group>

希望这可以帮助某人。

标签: pythondynamicdnsonchangeodoo

解决方案


推荐阅读