### 啟動向導
奇才發起 `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 {}
~~~