4

我正在尝试在我的一个瞬态模型中的 one2many 字段中创建关于布尔字段 onchange 的记录。

例如。

楷模

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

所以,打印语句给了我空白记录集。但是,当我更改 is_okay 字段时,我可以在视图中看到 5 条记录。

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

任何回应将不胜感激?

4

2 回答 2

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)]
    )}
于 2017-07-20T06:11:51.420 回答
0

不管 odoo 继续做同样的事情:

问题是 odoo 总是将这些记录传递给使用命令创建方法,1但在 odoo 中,我们不能在创建方法中使用此命令,这就是为什么您在方法调用中丢失此记录的原因。

(1, id, values) 用 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将在 create 方法中丢失。

但是如果你需要像你正在做的那样,你应该在 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)
于 2017-07-21T17:38:55.477 回答