### 启动向导
奇才发起 `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 {}
~~~