繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM