我正试图在一个关于布尔字段的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条记录。
我不知道如何在方法中获取这些行?
任何回复都会受到赞赏吗?
答案 0 :(得分:1)
它应该工作。这是有线行为。
您可以尝试使用 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)]
)}
答案 1 :(得分:0)
无论什么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的树必须包含在该字典中传递的所有字段,在这种情况下,如果name
具有oppisite.model
,则树必须具有字段test_field
例如,如果我们传递{'name': value, 'test_field': value_2}
,如果树只有name
字段值test_field
,则会在创建方法中丢失@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)
之类的其他字段。
但是如果你需要这样做,你应该使用arround odoo并在创建方法时将命令更改为4:
//Document listens for clicks on accordions
$(document).on('click','.accordion',function(){
//Add or Remove the active class on the clicked accordion
$(this).toggleClass('active');
//If the clicked accordionhas the active class, then show the panel
if($(this).hasClass('active')){
$(this).next('.panel').show();
} else { //Otherwise hide the panel
$(this).next('.panel').hide();
}
});