2015-04-03 137 views
0

我試圖實現一個many2one選擇字段,您從中選擇一個項目。如果您選擇了一個項目,那麼還有另一個可以從中選擇任務的many2one字段。這些任務都需要來自選定的項目。從選定的項目獲取任務

目前我得到這個(請注意,我無法測試它,因爲我一直得到XML錯誤):

class purchase_order(osv.osv): 
_inherit = 'purchase.order' 

def get_task(self, cr, uid, ids, project_id, context=None): 
    task_obj = self.pool.get('project.task') 
    for task in task_obj.browse(cr, uid, ids, context): 
     task_ids = task_obj.search(cr, uid, [(task.project_id.id, '=', project_id)]) 
     ids_cus = [] 
     for cus in task_obj.browse(cr, uid, task_ids, context): 
      if cus.project.id.id not in ids_cus: 
       ids_cus.append(cus.project_id.id) 
     self.write(cr, uid, ids, {'state_readonly': 'listed', 'task_ids': [(6, 0, ids_cus)]}) 
    return True 

_columns = { 
    'project_id': fields.many2one('project.project', 'Project'), 
    'task_id': fields.selection(get_task, 'Select task'), 
} 

我的XML看起來像這樣:

<record id="purchase_order_form" model="ir.ui.view"> 
     <field name="name">purchase.order.form</field> 
     <field name="model">purchase.order</field> 
     <field name="inherit_id" ref="purchase.purchase_order_form"/> 
     <field name="arch" type="xml"> 
      <field name="origin" position="after"> 
       <field name="project_id" on_change="_get_task(project_id)"/> 
       <field name="task_id" selection="widget"/> 
      </field> 
     </field> 
    </record> 

我是什麼在這裏做錯了XML?而且可能還有另一種方式?

回答

1

這解決了我問題,我添加了一個fields.related鏈接字段:

_columns = { 
    'task_id': fields.related('project_id', 'tasks', type='many2one', relation='project.task', store=True, 
           string='Task') 
} 

然後調整自己的XML(像@Empiro科技表示):

<record id="purchase_order_form" model="ir.ui.view"> 
     <field name="name">purchase.order.form</field> 
     <field name="model">purchase.order</field> 
     <field name="inherit_id" ref="purchase.purchase_order_form"/> 
     <field name="arch" type="xml"> 
      <field name="origin" position="after"> 
       <field name="project_id"/> 
       <field name="task_id" domain="[('project_id','=', project_id)]"/> 
      </field> 
     </field> 
    </record> 
1

沒有必要編寫方法來根據項目過濾任務,只需按照以下方法更改一些內容即可。

class purchase_order(osv.osv): 
_inherit = 'purchase.order' 

_columns = { 
    'project_id': fields.many2one('project.project', 'Project'), 
    'task_id': fields.many2one('project.task', 'Tasks'), 
} 

,改變你的XML,

<record id="purchase_order_form" model="ir.ui.view"> 
     <field name="name">purchase.order.form</field> 
     <field name="model">purchase.order</field> 
     <field name="inherit_id" ref="purchase.purchase_order_form"/> 
     <field name="arch" type="xml"> 
      <field name="origin" position="after"> 
       <field name="project_id" /> 
       <field name="task_id" domain="[('project_id','=',project_id.id)]" widget="selection" /> 
      </field> 
     </field> 
    </record> 

在現有代碼所做的小失誤,

selection="widget"不是XML有效的,你應該寫widget="selection"