在Odoo9中,我需要一个动态域,该域取决于向导上的many2one
字段。
通过使用各种示例,我使它起作用,但是过滤后的值始终对先前的选项有效。或者,如果我从过滤的域中选择一个(无效)选项,它们将是有效的。
详细信息:
在机会工作流程结束时,推销员应在其选择成功概率的地方评估机会。在特殊向导中有几个级别可供选择(“ 100%确定”,“不确定”,“也许”等)。我为此使用了fields.Selection
。然后,我介绍了一种新的机会类型(保留),其中只有100%和0%应该可用。因此,我创建了一个新模型evaluation_option
,将fields.Selection
替换为fields.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)
,其中compute_domain
与onchange相同,但以api.depends
装饰。没有一种方法能按预期工作。
我使用瞬态模型,其值(例如lead_id
)通过按钮上的上下文预先填充了默认值(default_lead_id
)。
无论我尝试什么,当我使域实际工作时,它都会过滤出值,但始终对先前的选择有效。这意味着如果我选择保留机会,我将获得所有选择,如果我选择正常机会,我将获得保留选项。如果下一个是常规机会,则选项是正确的。但是,如果我选择保留机会(并显示无效选项),然后选择无效选项,则无效选项会突然被滤除。我不确定,但是在我看来,这里也提到了同样的问题:domain filter for many2one fields in odoo?在接受答案的最后一条评论中。
您能看到一个明显的错误吗?或者您知道另一种动态更改域的方法吗?