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="['&',('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 - 编辑表单时设置动态域(不创建)的主要内容,如果未能解决你的问题,请参考以下文章