【问题标题】:Not getting records which created in One2many field on onchange in transient model在瞬态模型的 onchange 上未获取在 One2many 字段中创建的记录
【发布时间】:2017-07-19 10:54:55
【问题描述】:

我正在尝试在我的一个瞬态模型中的 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 条记录。

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

任何回应将不胜感激?

【问题讨论】:

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


    【解决方案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)]
        )}
    

    【讨论】:

    • 感谢您的回答,我会检查的。
    【解决方案2】:

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

    问题是 odoo 总是通过这个记录来使用命令1 创建方法但是在 odoo 我们不能在创建方法中使用这个命令并且这个 为什么你在方法调用中丢失了这些记录。

    (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 具有另一个字段,则树必须具有字段 name比如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)
    

    【讨论】:

    • 顺便说一句,谢谢你提出这个问题但是为什么要在 onchange 事件中在数据库中创建记录呢?!!
    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    相关资源
    最近更新 更多