Odoo v9 - 编辑表单时设置动态域(不创建)

Posted

技术标签:

【中文标题】Odoo v9 - 编辑表单时设置动态域(不创建)【英文标题】:Odoo v9 - Set a dynamic domain when EDITING a form (not creating) 【发布时间】:2016-09-18 05:54:21 【问题描述】:

假设您正在设置一个名为“动物类型”的字段,并且有一个依赖于此的字段,称为“最喜欢的玩具”。如果“动物类型”是一只狗,我想将“最喜欢的玩具”的域设置为 ('isdogtoy','=',True)。如果它是一只猫,那么也许我们将它设置为 False 或其他条件。

通常要设置动态域,你会使用 onchange,然后为字段设置域。

但是,在某些情况下没有任何变化。例如,如果您编辑现有记录,则不一定会调用 onchange。如果我从不更改“动物类型”,那么我在“最喜欢的玩具”上的域永远不会通过我的 onchange 方法设置。

我不确定我们如何在 Odoo 中动态执行此操作。似乎显然应该有一种方法,但我在这方面找不到任何东西。

【问题讨论】:

我不太明白你的意思,如果字段y 依赖于字段x,如果x 没有变化,如何触发字段y 的任何变化? 动态(变化的东西)域必须基于变化的东西。我怀疑你想要一个默认域,但在你澄清之前我永远无法知道。 好吧,说白了,我有一个 onchange 可以完成我在问题中描述的内容。当我制作新唱片时效果很好。但是,在我保存记录并返回并对其进行编辑后,域将重置为默认值。从用户的角度来看,这真的没有任何意义。当他们创建记录时,他们为“最喜欢的玩具”给出的选择是针对他们选择的动物的。现在他们去更改“最喜欢的玩具”,但 Odoo 为他们提供了不同的选择域。他们应该会看到与上次相同的选择。 好的,所以我有了创建计算域的想法,并使用它来帮助设置域中的变量....但我一辈子都无法获得计算域存储在数据库中。即使使用 store=True,这些值也不会被保存。我发誓,较新的 api 令人愤怒。我看到所有这些解决方案都适用于 v7,但在 v9 中没有办法做同样的事情。 向我们展示您的计算域解决方案的代码,也许我们可以解决问题:-) 计算字段也必须使用 @api.depends 装饰器。但我们必须先查看一些代码(xml 文件中包含相关视图的完整代码)才能给出任何答案 【参考方案1】:

这是我能想到的最好的方法,使用计算域。这是我的代码中的示例解决方案

在我的 XML 中,

 <field name="uom_id" position="replace">
      <!-- The category_id.name is really only used to filter when islocaluom=True. The result is that if a uom_class is used, only uom's from that class can be selected.  Otherwise, the default uom's are present -->

      <field name="uom_id" groups="product.group_uom" domain="['&amp;',('islocaluom','=',calcislocaluom),'|',('islocaluom','=',False),('category_id','=',calccatidname)]" options="'no_create' : True,'no_create_edit' : True" />
  </field>

现在我刚刚使用 store=True 创建了一些计算字段,然后将它们设置在计算函数中。

class ProductTemplate(models.Model):
  _inherit = 'product.template'
  #This field will let us choose if we are using per product uom on the product
  uom_class = fields.Many2one('productuom.class', 'Per Product UOM Conversion Class', ondelete='restrict',required=False, help="Unit of Measure class for Per Product UOM")
  #These computed fields are for calculating the domain on a form edit
  calcislocaluom = fields.Boolean('Find if its a localuom',compute='_computelocaluom', store=True, default=False)
  calccatidname = fields.Char('Find the name of the category id', compute='_computecatidname', store=True,default=True)
  #[...] other code removed

  @api.one
  @api.depends('uom_class')
  def _computelocaluom(self):
      if (self.uom_class):
          self.calcislocaluom = True
          return True
      else:
          self.calcislocaluom = False
          return False

  @api.one
  @api.depends('uom_class')
  def _computecatidname(self):
      if (self.uom_class):
          self.calccatidname = self.uom_class.name
          return self.uom_class.name
      else:
          #Due to the conditions we later impose within the view, we need to specify a category name that will always be there
          self.calccatidname = "Unsorted/Imported Units"
          return True

我将推迟将其标记为正确答案,因为它很难创建静态定义的域,这些域实际上可以按照我的意愿行事,并根据数据动态地采取行动……但必须用逆波兰表示法做这些复杂的陈述简直是折磨。

【讨论】:

以上是关于Odoo v9 - 编辑表单时设置动态域(不创建)的主要内容,如果未能解决你的问题,请参考以下文章

如何在odoo(版本8到15)中以可编辑模式隐藏字段

Java 创建填充PDF表单域

Java 创建填充PDF表单域

Java创建填充pdf表单域

单击时在 Java 中添加类似动态文本区域的对象

Odoo安装教程12-创建新的插件模块之设置视图层第二讲