[英]Not getting records which created in One2many field on onchange in transient model
我试图在一个boolean字段的onchange上的一个瞬态模型中的one2many字段中创建记录。
例如。
楷模
class test_model(models.TransientModel):
_name ="test.model"
is_okay = fields.Boolean("Okay?")
lines = fields.One2many("opposite.model","test_id",string="Lines")
@api.onchange('is_okay')
def onchnage_is_okay(self):
ids = []
for l in range(5):
record = self.env['opposite.model'].create({'name':str(l),'test_id':self.id})
ids.append(record.id)
self.lines = [(6,0,ids)]
class opposite_model(models.TransientModel):
_name ="opposite.model"
name = fields.Char("Name")
test_id = fields.Many2one("test.model",string="Test Model")
视图
<record id="view_form" model="ir.ui.view">
<field name="name">view.form</field>
<field name="model">test.model</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Test Model">
<field name="is_okay" />
<field name="lines" />
<footer>
<button name ="click_okay" string="Okay" type="object"/>
</footer>
</form>
</field>
</record>
现在,问题是当检查或取消选中is_okay字段时,它会填充One2many字段中的记录。
这工作正常。
但在我上面的视图中,我有一个调用方法click_okay()
按钮。
例如。
@api.one
def click_okay(self):
print self.lines
所以,print语句给我空白记录集。 但是,当我改变is_okay字段时,我可以在视图中看到5条记录。
我不知道如何在方法中获得这些线?
任何回应将不胜感激?
它应该工作。 这是有线行为。
您可以使用self.update()尝试以下替代方法
@api.onchange('is_okay')
def onchnage_is_okay(self):
ids = []
for l in range(5):
record = self.env['opposite.model'].create({'name':str(l),'test_id':self.id})
ids.append(record.id)
self.update({
'lines' : [(6,0,ids)]
)}
无论什么odoo继续做同样的事情:
问题是odoo总是传递这些记录来创建带有命令1
方法但是在odoo中我们不能在create方法中使用这个命令,这就是为什么你在方法调用中丢失了这个记录。
(1,id,values)使用值中的值更新id id的现有记录。 不能在create()中使用。
我不知道你为什么要在onchange
事件中创建这条记录,因为如果用户点击关闭而不是确定记录都已准备好在数据库中创建,并且每次检查按钮时都会重新创建此记录。
如果您不需要在onchange事件中创建此记录,您应该做的是:
@api.onchange('is_okay')
def onchnage_is_okay(self):
ids = []
for l in range(5):
record = self.env['opposite.model'].new({'name': str(l)})
ids.append(record.id)
self.lines = ids
这里onchange的一件事就是将字典返回到表单中,one2field的树必须具有在该字典中传递的所有字段,在这种情况下,如果oppisite.model
具有例如test_field
类的另一个字段,则树必须具有字段name
{'name': value, 'test_field': value_2}
如果树只有name
字段值test_field
将在create方法中丢失。
但是如果你需要像你一样,你应该工作arround odoo并在创建方法时将命令更改为4:
@api.model
def create(self, vals):
"""
"""
lines = vals.get('lines', False)
if lines:
for line in lines:
line[0] = 4
line[2] = False
vals.update({'lines': lines})
return super(test_model, self).create(vals)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.