向导(Wizards)

点我下载完整odoo的demo

在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方法,就可以获取到这个记录的对象了

更新应用后,效果如下:

11、odoo的向导页面_odoo

点我下载完整odoo的demo

参考:

https://www.odoo.com/documentation/10.0/howtos/backend.html#wizards

 

公众号

11、odoo的向导页面_odoo_02

 

关注我,我们一起成长~~