2015-11-03 43 views
0

我有兩個與one2many關係的表。我想在主表中更改名稱值後,在從表中創建一組記錄。但我有一個錯誤:Odoo 8.0。在代碼中創建從屬記錄

File "C:\odoo80\openerp\addons-custom\att\agreement.py", line 18, in _onchange_name

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

File "C:\odoo80\openerp\api.py", line 250, in wrapper return old_api(self, *args, **kwargs)

TypeError: create() takes at least 4 arguments (2 given)

我的類別是:

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> 

任何人可以幫助我嗎?

回答

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

謝謝!我rewrited方法是這樣的:

@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字段在AgreementLine表中爲空)。發生這種情況的原因是主記錄在創建從記錄之前未保存。但是我需要在on_change事件之後創建主記錄,然後將主記錄保存到數據庫中。相反,如果我使用列表按鈕「添加一個項目」的視圖我得到了一個正確的結果(我看到列表中添加的元素,但沒有數據庫) 我不知道,如何解決這個問題...

PS我需要一個類似於創建從屬記錄的行爲,點擊「添加項目」按鈕,但是在程序代碼中。

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

我對不起,但結果是相同的 – atimtim

+0

可以uput你的代碼在這個鏈接http://notepad.cc/dufuha63 py和xml – user00000341

+0

我已經把代碼和視圖。但我已經從on_change方法移動一個問題代碼來創建方法... – atimtim

0

這個代碼使所有作業:self.line_id + = self.line_id.new({ '名稱':STR(x)中, '數量':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}) 
+0

「new」會創建一個臨時記錄來應用on_change。 ...............所以你可以使用它............... – user00000341