向导(Wizards)
在odoo中通过使用向导(Wizard)创建一个表单与用户进行交互。向导的model使用TransientModel定义,TransientModel继承自Model,并有下面的特殊功能:
1 保存在TransientModel的记录会在提交完成后自动清理
2 wizard记录没有必要指定访问权限,默认所有用户都可以访问。
3 wizard记录中的字段可以通过many2one指向wizard对象或普通的model对象, 普通的model对象不能通过many2one指向wizard对象
下面我们将创建向导供用户来快速添加上课学生到课时中。
创建wizard
定义一个wizard,让用户批量的添加某节课时的上课学生。
在 myproject/my_first_app下创建一个文件夹wizard,然后在里面创建四个文件__init__.py、actions_menu.xml、myproject_wizard_view.xml和myproject_wizard.py。
在myproject/my_first_app/wizard/__init__.py中添加:
# -*- coding: utf-8 -*- from . import myproject_wizard
在myproject/my_first_app/__manifest__.py中允许访问这个文件:
'data': [ 'security/myproject_security.xml', 'security/ir.model.access.csv', 'data/course_data.xml', 'data/session_data.xml', 'views/menu_views.xml', 'views/course_views.xml', 'views/session_views.xml', 'views/res_partner_views.xml', 'wizard/myproject_wizard_view.xml', 'wizard/actions_menu.xml', ],
在myproject/my_first_app/__init__.py导入wizard:
# -*- coding: utf-8 -*- from . import controllers from . import models from . import wizard
myproject/my_first_app/wizard/myproject_wizard.py
# -*- coding: utf-8 -*- from odoo import models, fields, api class MyprojectWizard(models.TransientModel): _name = 'myproject.wizard' _description = '添加参与者' session_id = fields.Many2one('myproject.session', string="讲座", required=True) attendee_ids = fields.Many2many('res.partner', string="参与者") def subscribe(self): self.session_id.attendee_ids |= self.attendee_ids return {} @api.model def default_get(self, fields): result = super(MyprojectWizard, self).default_get(fields) result['session_id'] = self.env.context.get('active_id') return result
myproject/my_first_app/wizard/myproject_wizard_view.xml
<?xml version="1.0" encoding="utf-8"?> <odoo> <record id="wizard_form_view" model="ir.ui.view"> <field name="name">myproject.wizard.view.form</field> <field name="model">myproject.wizard</field> <field name="arch" type="xml"> <form string="添加参与者"> <sheet> <group> <field name="session_id"/> <field name="attendee_ids"/> </group> </sheet> <footer> <button string="取消" class="oe_link" special="cancel"/> <!-- type选择object,type 值可以是 workflow, object action 默认是 workflow--> <!-- name是需要定义的方法名--> <button string="添加" name="subscribe" type="object" class="oe_highlight" /> </footer> </form> </field> </record> <record id="myproject_wizard_action_form" model="ir.actions.act_window"> <field name="name">添加参与者</field> <field name="res_model">myproject.wizard</field> <field name="view_mode">form</field> <field name="target">new</field> </record> <record id="action_wizard" model="ir.actions.act_window"> <field name="name">添加参与者</field> <field name="res_model">myproject.wizard</field> <field name="view_mode">form</field> <field name="target">new</field> <field name="context">{ 'default_composition_mode': 'comment', 'default_res_id': active_id, }</field> <field name="binding_model_id" ref="my_first_app.model_myproject_session"/> <field name="binding_view_types">form</field> </record> </odoo>
myproject/my_first_app/wizard/actions_menu.xml
<?xml version="1.0" encoding="utf-8"?> <odoo> <!-- Add action entry in the Action Menu for Leads --> <record id="action_wizard" model="ir.actions.act_window"> <field name="name">添加参与者</field> <field name="res_model">myproject.wizard</field> <field name="view_mode">form</field> <field name="target">new</field> <field name="context">{ 'default_composition_mode': 'comment', 'default_res_id': active_id, }</field> <field name="binding_model_id" ref="my_first_app.model_myproject_session"/> <field name="binding_view_types">form</field> </record> </odoo>
启动向导
1 定义向导显示的form视图
2 在contextual actions中调用此向导
3 定义向导模型中session_id的默认值,通过self._context中active_id获取
active_id为当前form的所显示模型的id,通过模型的browse方法,就可以获取到这个记录的对象了
更新应用后,效果如下:
参考:
https://www.odoo.com/documentation/10.0/howtos/backend.html#wizards
公众号
关注我,我们一起成长~~