首页 文章

Odoo 8.0 . 在代码中创建从属记录

提问于
浏览
0

我有2个表与 one2many 关系 . 我想在更改master表中的名称值后在slave表中创建一组记录 . 但是我有一个错误:

文件“C:\ odoo80 \ openerp \ addons-custom \ att \ agreement.py”,第18行,在_onchange_name self.pool ['att.agreement.line'] . create({'agreement_id':id,'name ':str(x),'qty':x * 100})文件“C:\ odoo80 \ openerp \ api.py”,第250行,在包装器中返回old_api(self,* args,** kwargs)TypeError:create ()至少需要4个参数(给定2个)

My classes are:

class Agreement(models.Model):
    _name = 'att.agreement'
    line_id = fields.One2many('att.agreement.line','agreement_id', 'Lines', copy=True )
    name = fields.Char(string='Name', required=True)

    def create(self, cr, uid, values, context=None):
        return super(Agreement, self).create(cr, uid, values, context)

    @api.onchange('name')
    def _onchange_name(self):
        if (self.name):
           for x in range(1,5,1):
               self.pool['att.agreement.line'].create({'agreement_id': id , 'name': str(x), 'qty': x * 100} )

    class AgreementLine(models.Model):
    _name = 'att.agreement.line'
    agreement_id = fields.Many2one('att.agreement', ondelete='cascade', select=True ) # required=True ,readonly = True
    name = fields.Char(string='Name', required=True)
    qty  = fields.Integer(string = 'Qty')

    def create(self, cr, uid, values, context=None):
        id = super(AgreementLine, self).create(cr, uid, values, context)
        return id

My view is:

<?xml version="1.0" encoding="UTF-8"?>
     <openerp>
        <data>
            <!-- form AGREEMENT -->
            <record model="ir.ui.view" id="att_agreement_view_form">
                <field name="name">Agreement</field>
                <field name="model">att.agreement</field>
                <field name="arch" type="xml">
                <form string="Agreement">
                        <sheet>
                            <group colspan="4">
                                <group>
                                    <field name="name"/>
                                </group>
                            </group>
                             <notebook>
                                    <page string="Agreement Lines">
                                        <tree string="Agreement Lines"  create ='false'>
                                            <field name="line_id" >
                                                    <field name = "id"/>
                                                    <field name="name"/>
                                                    <field name="qty"/>
                                            </field>
                                        </tree>
                                    </page>
                             </notebook>
                        </sheet>
                </form>
                </field>
            </record>

            <record model="ir.ui.view" id="att_agreement_view_tree">
                <field name="name">List of agreement</field>
                <field name="model">att.agreement</field>
                <field name="arch" type="xml">
                    <tree string="List of agreements">
                        <field name="name"/>
                    </tree>
                </field>
            </record>

            <!-- window action -->
            <record model="ir.actions.act_window" id="att_agreement_list_action">
                <field name="name">Agreement</field>
                <field name="res_model">att.agreement</field>
                <field name="view_mode">tree,form</field>
            </record>

            <menuitem id="att_agreement_menuitem" name="Соглашения"
                      parent="att_menu_agreement"
                      action="att_agreement_list_action"/>
        </data>
    </openerp>

有谁能够帮我?

4 回答

  • 0

    您正在混合使用Odoo的API 8和API 7版本 . 在您的情况下,您正在使用API 8,因此请勿使用 pool . 请改用 env

    self.env['att.agreement.line'].create({'agreement_id': id , 'name': str(x), 'qty': x * 100})
    
  • 0

    谢谢!我重写了这样的方法:

    @api.onchange('name')
       def _onchange_name(self):
           if self.name:
               if isinstance(self.id, models.NewId):
                   for x in range(1,6,1):
                       self.line_id.create({'agreement_id': self.id, 'name': str(x), 'qty': x * 100})
    

    我有没有运行时错误的代码 . 但我现在有另一个问题 - 创建了奴隶记录而没有与主记录的链接(协议列表中的 agreement_id 字段为空) . 之所以发生是因为主记录不知道,如何解决这个问题......

    附:我需要一个像创建奴隶记录的行为,点击按钮“添加项目”,但在程序代码中 .

  • 0
    class Agreement(models.Model):
        _name = 'att.agreement'
        line_id = fields.One2many('att.agreement.line','agreement_id', 'Lines', copy=True )
        name = fields.Char(string='Name', required=True)
    
        @api.model
        def create(self,  values):
            return super(Agreement, self).create( values)
    
        @api.onchange('name')
        def _onchange_name(self):
            if (self.name):
               for x in range(1,5,1):
                   self.env['att.agreement.line'].create({'agreement_id': self. id , 'name': str(x), 'qty': x * 100} )
    
    
    
    
     class AgreementLine(models.Model):
        _name = 'att.agreement.line'
        agreement_id = fields.Many2one('att.agreement', ondelete='cascade', select=True ) # required=True ,readonly = True
        name = fields.Char(string='Name', required=True)
        qty  = fields.Integer(string = 'Qty')
    
        @api.model
        def create(self, values):
            return super(AgreementLine, self).create( values)
    
  • 0

    这段代码完成了所有工作: self.line_id += self.line_id.new({'name': str(x), 'qty': x})

    @api.onchange('name')
    def _on_change_name(self):
            if self.name:
                for x in range(1,5,1):
                    self.line_id += self.line_id.new({'name': str(x), 'qty': x})
    

相关问题