0

私は関係を持つ2つのテーブルを持っていone2manyます。マスター テーブルの名前の値を変更した後、スレーブ テーブルに一連のレコードを作成したいと考えています。しかし、私はエラーがあります:

ファイル「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 つ指定)

私のクラスは次のとおりです。

    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

私の見解は次のとおりです。

<?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

4 に答える 4

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})
于 2015-11-05T13:06:33.923 に答える
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})

実行時エラーのないコードを取得しました。しかし、私は今別の問題を抱えています - マスターレコードとのリンクなしでスレーブレコードが作成されました ( AgreementLine テーブルのAgreement_idフィールドは空です)。これは、スレーブ レコードを作成する前にマスター レコードが保存されていなかったために発生しました。しかし、マスター レコードがデータベースに保存される前に、on_change イベントの後にスレーブ レコードを作成する必要があります。逆に、ビューで「アイテムを追加」リストボタンを使用すると、正しい結果が得られます (リストに追加された要素が表示されますが、データベースには何も表示されません) この問題を解決する方法がわかりません。 ..

PS「アイテムを追加」ボタンをクリックしてスレーブレコードを作成するような動作が必要ですが、プログラムコードで必要です。

于 2015-11-03T23:20:02.490 に答える
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)
于 2015-11-04T06:15:25.323 に答える
0

Odoo の API 8 バージョンと API 7 バージョンを混在させています。あなたの場合、API 8 を使用しているため、使用しないでくださいpoolenv代わりに使用してください:

self.env['att.agreement.line'].create({'agreement_id': id , 'name': str(x), 'qty': x * 100})
于 2015-11-03T12:21:42.877 に答える