2016-08-23 44 views
2

這裏是mycode。我想當前記錄的id_employee之前定義的模型類:Odoo:_get_state()在xml視圖中至少需要4個參數(給出4個參數)

def _get_state(self, cr, uid, context=None): 
    idemployee = "" 
    for adv in self.browse(cr, uid, ids, context): 
     id_employee = adv.id_employee 
     if id_employee is None: 
      idemployee = _default_employee(self, cr, uid, context=None) 
     else: 
      idemployee = id_employee 

    sql = " SELECT C.id AS id, C.sequence, C.name \ 
        FROM wf_group_member A \ 
      LEFT JOIN wf_group B ON B.id = A.group_id \ 
      LEFT JOIN wf_process BB ON BB.id = B.process_id \ 
      LEFT JOIN wf_state C ON C.group_id = B.id \ 
      LEFT JOIN hr_employee D ON D.id = A.member_id \ 
      WHERE LOWER(code) = 'ca' AND member_id = %s ORDER BY sequence " 
    res = [] 
    cr.execute(sql, [(idemployee)]) 
    ardata = cr.fetchall() 
    for data in ardata: 
     res.append((data[1], data[2])) 
    return res 

,這就是我把它_get_state功能

class cashadvance(osv.osv): 
    _name = 'ga.cashadvance' 
    _columns = { 
     'id_user'     : fields.many2one('res.users', string='User', required=True, readonly=True), 
     'state'      : fields.selection(_get_state, 'Status', readonly=True), 
     'id_employee'    : fields.many2one('hr.employee', string='Employee', required=True, readonly=True), 
    } 

當我打電話_get_state功能後,我的模型類,它提出錯誤:

Error details: 
global name 'ids' is not defined 
None" while parsing /opt/custom-addons/comben/views/cashadvance_view.xml:4, near 
<record id="cashadvance_list" model="ir.ui.view"> 
      <field name="name">cashadvance_list</field> 
      <field name="model">ga.cashadvance</field> 
      <field name="arch" type="xml"> 
       <tree string="Cashadvance List"> 
        <field name="id_employee"/> 
        <field name="category_id"/> 
        <field name="est_date_from" string="Est Date From"/> 
        <field name="est_date_to" string="Est Date To"/> 
        <field name="description"/> 
        <field name="state"/> 
       </tree> 
      </field> 
     </record> 

可以somebady請幫助我,謝謝

+0

什麼是t他應該做'idemployee = _default_employee(self,cr,uid,context = None)',具體是什麼'_default_employee'? – danidee

+0

_default_employee是一個函數,通過uid調用hr_employee中的employee_id,它將返回employee_id,並且它沒有問題 – yogakumboro

回答

1

_get_state必須是類的一部分,以便您不在課堂外使用它,您在那裏傳遞的自身不會被視爲python self,即當前實例,它被視爲函數的正常參數。

Python沒有爲你自我傳遞,讓我偏離一點點,並重現你得到的錯誤。看看這段代碼

def func(self,cr, uid, ids, context=None): 
    pass 

class func_test: 
    def __init__(self): 
     func(1, 1, 1, context=1) 

a = func_test() 

這是引發的錯誤(請確保您有python2運行此)

Traceback (most recent call last): 
    File "script.py", line 8, in <module> 
    a = func_test() 
    File "script.py", line 6, in __init__ 
    func(1, 1, 1, context=1) 
TypeError: func() takes at least 4 arguments (4 given) 

蟒蛇其實是正確的,即使它是誤導性的,該函數需要至少四個參數,因爲上下文是一個關鍵字參數,在函數定義時已被填充,但它仍然缺少一個參數,因爲該函數在類之外,因此通常將名爲self的第一個參數視爲普通參數(因爲它是一個函數)不是方法(類中的函數)。所以從左邊開始向右selfcruid將被填寫爲111離開ids在這一點蟒蛇會大聲呼救,因爲沒有價值被發現的這樣的說法,如果我們進入這個函數到類和呼叫它與self.func,當前實例自動獲得我們通過。

class func_test: 
    def func(self,cr, uid, ids, context=None): 
     pass 

    def __init__(self): 
     self.func(1, 1, 1, context=1) 

a = func_test() 

當然,你仍然可以有func(self, 1, 1, 1, context=1)但是這將是擊敗的方法

目的不過需要注意的python3是聰明,處理這種情況比python2更好,這是一個python3回溯

Traceback (most recent call last): 
    File "script.py", line 8, in <module> 
    a = func_test() 
    File "script.py", line 6, in __init__ 
    func(1, 1, 1, context=1) 
TypeError: func() missing 1 required positional argument: 'ids' 

說白告訴我們,沒有價值在函數調用

所以回到提供ids到Odoo你的代碼看起來應該是這樣

from openerp.osv import osv, fields 

class cashadvance(osv.osv): 
    _name='comben.cashadvance' 

    def _get_state(self, cr, uid, context=None): 
     idemployee = "" 

     ids = self.search(cr, uid, [], context=context) # you probably want to search for all the records 
     for adv in self.browse(cr, uid, ids, context=context): 
      id_employee = adv.id_employee 
      if id_employee is None: 
       idemployee = self._default_employee(cr, uid, ids, context=None) # might raise singleton error if more than one record is returned 
      else: 
       idemployee = id_employee.id 

     sql = " SELECT C.id AS id, C.sequence, C.name \ 
        FROM wf_group_member A \ 
      LEFT JOIN wf_group B ON B.id = A.group_id \ 
      LEFT JOIN wf_process BB ON BB.id = B.process_id \ 
      LEFT JOIN wf_state C ON C.group_id = B.id \ 
      LEFT JOIN hr_employee D ON D.id = A.member_id \ 
      WHERE LOWER(code) = 'ca' AND member_id = %s ORDER BY sequence " 
     res = [] 
     cr.execute(sql, [(idemployee)]) 
     ardata = cr.fetchall() 
     for data in ardata: 
      res.append((data[1], data[2])) 

     return res 

    _columns = { 
     'id_user': fields.many2one('res.users', string='User', required=True, readonly=True), 
     'state': fields.selection(_get_state, string='Status', readonly=True), 
     'id_employee': fields.many2one('hr.employee', string='Employee', required=True, readonly=True), 
    } 

而且移動_default_employee進級身上,所以你可以這樣調用

self._default_employee(cr, uid, context=None) # python implicitly passes self for you 

XML視圖

<record id="cashadvance_list" model="ir.ui.view"> 
    <field name="name">cashadvance list</field> 
    <field name="model">comben.cashadvance</field> 
    <field name="arch" type="xml"> 
    <tree string="Cashadvance List"> 
     <field name="id_employee"/> 
     <field name="id_user"/> 
     <field name="state"/> 
    </tree> 
    </field> 
</record> 
+0

我跟着你的代碼,並且提出錯誤:「全局名稱'ids'沒有被定義。 它似乎從self.browse(cr,uid,ids,上下文)的副本︰ 需要更多的幫助請 – yogakumboro

+0

哎呀抱歉,我已經在_get_state參數中添加ID,但隨後引發錯誤: ParseError : 「無效視圖定義 錯誤詳細信息: get_state()至少需要4個參數(4給出) 無」,而解析/opt/custom-addons/comben/views/cashadvance_view.xml:4附近, 仍然同樣的錯誤,我真的很困惑, – yogakumboro

+0

你有沒有按照我的最新代碼....也請貼上這個提示錯誤的XML – danidee

0

在這種情況下, ,你想要這個:

def _get_state(self, cr, uid, ids, context=None): 
     current_record=self.browse(cr, uid, ids) 
     idemployee = current_record[0].id_employee 

    sql = " SELECT C.id AS id, C.sequence, C.name \ 
        FROM wf_group_member A \ 
      LEFT JOIN wf_group B ON B.id = A.group_id \ 
      LEFT JOIN wf_process BB ON BB.id = B.process_id \ 
      LEFT JOIN wf_state C ON C.group_id = B.id \ 
      LEFT JOIN hr_employee D ON D.id = A.member_id \ 
      WHERE LOWER(code) = 'ca' AND member_id = %s ORDER BY sequence " 
    res = [] 
    cr.execute(sql, [(idemployee)]) 
    ardata = cr.fetchall() 
    for data in ardata: 
     res.append((data[1], data[2])) 
    return res 
+0

感謝您的回答,但我需要在列之前獲取字段值,因爲我想在get_state函數中將該字段值用作參數cr.execure以進行狀態字段選擇 – yogakumboro

+0

@yogakumboro,糾正 –

+0

我跟着你的代碼,並在XML引發錯誤: ParseError:「無效的視圖定義 錯誤的詳細信息: 全局名稱‘IDS’沒有定義 – yogakumboro

相關問題