python - 动态域在odoo9中不能正常工作
问题描述
在 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)
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>
希望这可以帮助某人。
解决方案
推荐阅读
- php - Laravel 没有创建 RegisterController
- javascript - javascript 返回并获取上一页 FINAL STATE
- javascript - 如何制作切换路由路径?
- facebook - 从 facebook ui 导出 csv 和使用 InsightAPI 之间的区别
- c++ - 程序并行 QThread 在应用程序退出时创建内存泄漏
- ruby-on-rails - Rails Graphql 解决错误:参数数量错误(给定 1,预期 3)
- c# - 试图在我自己的程序中注入一个库
- android - 如何抬起键盘上方的按钮
- javascript - 使用 vue-router 重新加载组件
- java - 没有得到错误 500 的解决方案,其根本原因是 java.lang.NoClassDefFoundError: java/sql/Driver