Odoo向導Wizard與上下文動作及代碼示例


本文主要介紹Odoo向導Wizard如何創建並提供代碼示例

Odoo向導Wizard

在odoo中通過使用向導(Wizard)創建一個表單與用戶進行交互。向導的model使用TransientModel定義,TransientModel繼承自Model,並有下面的特殊功能
1 保存在TransientModel的記錄會在提交完成后自動清理
2 wizard記錄沒有必要指定訪問權限,默認所有用戶都可以訪問。
3 wizard記錄中的字段可以通過many2one指向wizard對象或普通的model對象, 普通的model對象不能通過many2one指向wizard對象

代碼示例

定義一個wizard,讓用戶批量的添加某節課時的上課學生

odoogoedu/wizard.py

from odoo import models, fields, api

class Wizard(models.TransientModel):
_name = 'odoogoedu.wizard'

session_id = fields.Many2one('odoogoedu.session',
string="Session", required=True)
attendee_ids = fields.Many2many('res.partner', string="Attendees")
新建的odoogoedu/wizard.py 需要導入到odoogoedu/__manifest__.py

from . import wizard
運行wizard

可以通過ir.actions.act_window模型表里的記錄發起,可以從menu里或者通過某個button觸發。另外還有一種方式,在form view上方的下拉按鈕組(上下文動作contextual actions)中調用,設置好src_model關聯 對應的model。

 

啟動向導

1 定義向導顯示的form視圖
2 在contextual actions中調用此向導
3 定義向導模型中session_id的默認值。通過self._context中active_id獲取,active_id為當前form的所顯示模型的id,通過模型的browse方法,就可以獲取到這個記錄的對象了。

odoogoedu/wizard.py

class Wizard(models.TransientModel):
_name = 'odoogoedu.wizard'

def _default_session(self):
return self.env['odoogoedu.session'].browse(self._context.get('active_id'))

session_id = fields.Many2one('odoogoedu.session',
string="Session", required=True, default=_default_session)
attendee_ids = fields.Many2many('res.partner', string="Attendees")
@api.multi
def subscribe(self):
self.session_id.attendee_ids |= self.attendee_ids
return {}
odoogoedu/views/views.xml

parent="odoogoedu_menu"
action="session_list_action"/>


wizard.form
odoogoedu.wizard




or

 



完善向導

完善上面的wizard,在一個wizard里操作多個課時。

odoogoedu/views/views.xml




odoogoedu/wizard.py

class Wizard(models.TransientModel):
_name = 'odoogoedu.wizard'

def _default_sessions(self):
return self.env['odoogoedu.session'].browse(self._context.get('active_ids'))

session_ids = fields.Many2many('odoogoedu.session',
string="Sessions", required=True, default=_default_sessions)
attendee_ids = fields.Many2many('res.partner', string="Attendees")

@api.multi
def subscribe(self):
for session in self.session_ids:
session.attendee_ids |= self.attendee_ids
return {}
@api.multi 返回None即可

參考文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM