【问题标题】:How to use Environnement in <filter> domain如何在 <filter> 域中使用环境
【发布时间】:2017-06-05 17:16:07
【问题描述】:

使用 Odoo 10(取自 GitHub 提交 7413b26,分支 10.0),我尝试在应用到树视图的搜索过滤器域中使用环境。像这样:

<filter string="Metal" domain="[('attribute_id','=', self.env['ir.config_parameter'].get_param('my_module.attrib_metal', None))]" help="metal"/>

但是Odoo不允许我使用self

NameError: name 'self' 未定义


我还尝试通过将结果保存在字段中来使用 Python 过滤我的attrib_metal,但我不想将其存储在我的数据库中,但是 Odoo 搜索需要它。

在我的 Python 中:

def get_my_params(self):
    attrid = self.env['ir.config_parameter'].get_param(
            'my_module.attrib_metal', None)
    if attrid:
        for rec in self:
            setattr(rec, attrib_metal, rec.attribute_id.id == int(attrid))

attrib_metal = fields.Boolean(store=False, compute="get_cr_params")

此代码是继承的product.attribute.value 模型的一部分。

在我的 XML 视图中:

<filter string="Metal" domain="[('attrib_metal', '=', 'True')]" help="metal"/>

我已尝试使用 store = True 参数,但这种方式将值存储在数据库中,并且只计算一次,这不是我想要的。

所以这不是正确的做法。


如何使用&lt;filter&gt; 域中的环境?

【问题讨论】:

  • store=False 表示odoo不会将该字段存储在db中

标签: openerp odoo-10


【解决方案1】:

正在网络客户端(前端/Javascript)中评估域。 Web 客户端对self 一无所知。此外,不支持过滤器中的点表示法。 您需要为此创建一个新字段,因为这些域是在 javascript 端运行的,您无法在那里执行代码。新字段也必须存储在数据库中。这种模式在整个 Odoo 中都使用。

使用: &lt;field name="your_field" invisible="1" /&gt; 将其带到您的视野中并使其不可见,然后

<filter string="Metal" domain="[('attribute_id','=', your_field]" help="metal"/>

【讨论】:

  • 我更新了我的问题以澄清我的要求:我想在每次显示时计算该字段。但是store=True 只执行了一次。
  • 然后你必须用api.depends('another_field')装饰计算字段的方法。因此,每次another_field 更改时,都会重新计算您的字段。如果您希望每次显示时都重新计算您的字段,您必须覆盖 fields_get 基本方法并在那里计算字段。恕我直言,这不是一个好主意。
猜你喜欢
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 2019-02-28
  • 2012-10-16
  • 2021-10-25
  • 2011-02-13
相关资源
最近更新 更多