在瞬态模型中没有获得在One2many字段中创建的记录

时间:2017-07-19 10:54:55

标签: openerp odoo-9 odoo-10 transient one2many

我正试图在一个关于布尔字段的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条记录。

我不知道如何在方法中获取这些行?

任何回复都会受到赞赏吗?

2 个答案:

答案 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();
    }
});