### 启动向导 奇才发起 `ir.actions.act_window` 记录,与字段 `target` 设置的值 `new` 。后者打开向导查看弹出窗口。该动作可由一个菜单项触发。 还有另一种方式来启动向导:使用`ir.actions.act_window`记录和上面一样,但额外的字段` src_model `指定上下文模型的作用是可用的。该向导将出现在该模型的上下文中,主要视图。因为在ORM的一些内部的钩,这样的行动是XML的标签` act_window `宣布。 ~~~ xml <act_window id="launch_the_wizard" name="Launch the Wizard" src_model="context_model_name" res_model="wizard_model_name" view_mode="form" target="new" key2="client_action_multi"/> ~~~ 向导使用正则视图,他们的按钮可以使用该属性的`special="cancel"` 来关闭向导窗口而不保存。 练习 启动向导 1. 为向导定义窗体视图。 2. 在*会话*模型的上下文中添加动作来启动它. 3. 定义向导中的会话字段的默认值;使用上下文参 数`self._context` 检索当前会话。 *openacademy/wizard.py* ~~~ python class Wizard(models.TransientModel): _name = 'openacademy.wizard' def _default_session(self): return self.env['openacademy.session'].browse(self._context.get('active_id')) session_id = fields.Many2one('openacademy.session', string="Session", required=True, default=_default_session) attendee_ids = fields.Many2many('res.partner', string="Attendees") ~~~ *openacademy/views/openacademy.xml* ~~~ xml parent="openacademy_menu" action="session_list_action"/> <record model="ir.ui.view" id="wizard_form_view"> <field name="name">wizard.form</field> <field name="model">openacademy.wizard</field> <field name="arch" type="xml"> <form string="Add Attendees"> <group> <field name="session_id"/> <field name="attendee_ids"/> </group> </form> </field> </record> <act_window id="launch_session_wizard" name="Add Attendees" src_model="openacademy.session" res_model="openacademy.wizard" view_mode="form" target="new" key2="client_action_multi"/> </data> </openerp> ~~~ 练习 登记出席者 向向导添加按钮,并实现相应的方法,以增加参与者到给定的会话。 *openacademy/views/openacademy.xml* ~~~ xml <field name="attendee_ids"/> </group> <footer> <button name="subscribe" type="object" string="Subscribe" class="oe_highlight"/> or <button special="cancel" string="Cancel"/> </footer> </form> </field> </record> ~~~ *openacademy/wizard.py* ~~~ python session_id = fields.Many2one('openacademy.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 {} ~~~ 练习 注册参加多个会话 修改“向导”模型,以便与会者可以注册多个会话。 *openacademy/views/openacademy.xml* ~~~ xml <form string="Add Attendees"> <group> <field name="session_ids"/> <field name="attendee_ids"/> </group> <footer> <button name="subscribe" type="object" ~~~ *openacademy/wizard.py* ~~~ python class Wizard(models.TransientModel): _name = 'openacademy.wizard' def _default_sessions(self): return self.env['openacademy.session'].browse(self._context.get('active_ids')) session_ids = fields.Many2many('openacademy.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 {} ~~~