1.在Action中定義,context用於傳遞搜索條件和分組條件,在搜索視圖中默認顯示:
示例代碼:

<record model="ir.actions.act_window" id="open_company_allocation"> <field name="name">Leaves Summary</field> <field name="res_model">hr.holidays</field> <field name="view_type">form</field> <field name="view_mode">tree,form</field> <field name="view_id" eval="view_holiday_simple"/> <field name="context">{'search_default_group_type': 1, 'search_default_validated': 1}</field> <field name="domain">[('holiday_type','=','employee')]</field> <field name="search_view_id" ref="view_hr_holidays_filter"/> </record>
其中:
<field name="context">{'search_default_group_type': 1, 'search_default_validated': 1}</field>
定義了窗口打開時默認的分組條件 group_type 和過濾條件 validated ,如圖所示:
對應的搜索視圖代碼:

<record id="view_hr_holidays_filter" model="ir.ui.view"> <field name="name">hr.holidays.filter</field> <field name="model">hr.holidays</field> <field name="arch" type="xml"> <search string="Search Leave"> <field name="name"/> <separator/> <filter icon="terp-check" domain="[('state','=','draft')]" string="To Confirm"/> <filter icon="terp-camera_test" domain="[('state','in',('confirm','validate1'))]" string="To Approve" name="approve"/> <filter icon="terp-camera_test" domain="[('state','=','validate')]" string="Validated" name="validated"/> <separator/> <filter icon="terp-go-year" name="year" string="Year" domain="[('holiday_status_id.active','=',True)]" help="Filters only on allocations and requests that belong to an holiday type that is 'active' (active field is True)"/> <separator/> <filter string="My Leaves" icon="terp-personal" name="my_leaves" domain="[('employee_id.user_id','=', uid)]" help="My Leaves"/> <separator/> <filter string="My Department Leaves" icon="terp-personal+" help="My Department Leaves" domain="[('department_id.manager_id','=',uid)]"/> <field name="employee_id"/> <field name="department_id"/> <field name="holiday_status_id"/> <group expand="0" string="Group By..."> <filter name="group_name" string="Description" domain="[]" context="{'group_by':'name'}"/> <filter name="group_date_from" string="Start Date" icon="terp-personal" domain="[]" context="{'group_by':'date_from'}"/> <filter name="group_employee" string="Employee" icon="terp-personal" domain="[]" context="{'group_by':'employee_id'}"/> <filter name="group_category" string="Category" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'category_id'}"/> <filter string="Manager" icon="terp-personal" domain="[]" context="{'group_by':'manager_id'}"/> <filter string="Department" icon="terp-personal+" domain="[]" context="{'group_by':'department_id','set_visible':True}"/> <filter name="group_type" string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'holiday_status_id'}"/> <filter string="Status" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/> </group> </search> </field> </record>
2.在Action中定義,context用於傳遞創建對象的默認值:
示例代碼:XML中定義Action,context用於傳遞創建對象的默認值

<act_window id="act_crm_opportunity_crm_phonecall_new" name="Phone calls" groups="base.group_sale_salesman" res_model="crm.phonecall" view_mode="tree,calendar,form" context="{'default_duration': 1.0 ,'default_opportunity_id': active_id}" view_type="form"/>
示例代碼:Python后台代碼中動態給Action的context賦值,context用於傳遞創建對象的默認值:

def action_makeMeeting(self, cr, uid, ids, context=None): """ Open meeting's calendar view to schedule meeting on current opportunity. :return dict: dictionary value for created Meeting view """ opportunity = self.browse(cr, uid, ids[0], context) res = self.pool.get('ir.actions.act_window').for_xml_id(cr, uid, 'base_calendar', 'action_crm_meeting', context) res['context'] = { 'default_opportunity_id': opportunity.id, 'default_partner_id': opportunity.partner_id and opportunity.partner_id.id or False, 'default_partner_ids' : opportunity.partner_id and [opportunity.partner_id.id] or False, 'default_user_id': uid, 'default_section_id': opportunity.section_id and opportunity.section_id.id or False, 'default_email_from': opportunity.email_from, 'default_name': opportunity.name, } return res
其中:
context="{'default_duration': 1.0 ,'default_opportunity_id': active_id}"
res['context'] = {
'default_opportunity_id': opportunity.id,
'default_partner_id': opportunity.partner_id and opportunity.partner_id.id or False,
'default_partner_ids' : opportunity.partner_id and [opportunity.partner_id.id] or False,
'default_user_id': uid,
'default_section_id': opportunity.section_id and opportunity.section_id.id or False,
'default_email_from': opportunity.email_from,
'default_name': opportunity.name,
}
定義了Action對應的對象創建新記錄時的默認值。
3.在搜索視圖中定義,context用於傳遞在視圖中使用的變量:
示例代碼:

<!-- CRM Lead Search View --> <record id="view_crm_case_leads_filter" model="ir.ui.view"> <field name="name">CRM - Leads Search</field> <field name="model">crm.lead</field> <field name="arch" type="xml"> <search string="Search Leads"> <field name="name" string="Lead / Customer" filter_domain="['|','|',('partner_name','ilike',self),('email_from','ilike',self),('name','ilike',self)]"/> <field name="categ_ids" string="Category" filter_domain="[('categ_ids','ilike',self)]"/> <field name="section_id" context="{'invisible_section': False, 'default_section_id': self}"/> <field name="user_id"/> <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/> <field name="create_date"/> <field name="country_id" context="{'invisible_country': False}"/> <separator/> <filter string="Open" name="open" domain="[('state','!=','cancel')]" help="Open Leads"/> <filter string="Dead" name="dead" domain="[('state','=','cancel')]"/> <filter string="Unassigned" domain="[('user_id','=', False)]" help="No salesperson"/> <filter string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]" help="Unread messages"/> <filter string="Assigned to Me" domain="[('user_id','=',uid)]" context="{'invisible_section': False}" help="Leads that are assigned to me"/> <filter string="Assigned to My Team(s)" domain="[('section_id.member_ids', 'in', [uid])]" context="{'invisible_section': False}" help="Leads that are assigned to any sales teams I am member of"/> <separator /> <filter string="Available for mass mailing" name='not_opt_out' domain="[('opt_out', '=', False)]" help="Leads that did not ask not to be included in mass mailing campaigns"/> <separator /> <group expand="0" string="Group By..."> <filter string="Salesperson" domain="[]" context="{'group_by':'user_id'}"/> <filter string="Team" domain="[]" context="{'group_by':'section_id'}"/> <filter string="Stage" domain="[]" context="{'group_by':'stage_id'}"/> <filter string="Customer" help="Partner" domain="[]" context="{'group_by':'partner_id'}"/> <filter string="Country" domain="[]" context="{'group_by':'country_id'}"/> <filter string="Referrer" domain="[]" context="{'group_by':'referred'}"/> <filter string="Campaign" domain="[]" context="{'group_by':'type_id'}"/> <filter string="Channel" domain="[]" context="{'group_by':'channel_id'}"/> <filter string="Creation" domain="[]" context="{'group_by':'create_date'}"/> </group> <group string="Display"> <filter string="Show Countries" context="{'invisible_country': False}" help="Show Countries"/> <filter string="Show Sales Team" context="{'invisible_section': False}" domain="[]" help="Show Sales Team"/> </group> </search> </field> </record>
其中:
<filter string="Show Countries" context="{'invisible_country': False}" help="Show Countries"/>
定義了在搜索視圖中選擇“顯示國家”時,設置變量 invisible_country 的值為 False,tree 視圖中引用變量,設置字段“國家”的顯示或隱藏,
tree視圖中的代碼如下所示:
<field name="country_id" invisible="context.get('invisible_country', True)"/>
4.在Action中定義,context用於傳遞在后台搜索方法中使用的變量:
示例代碼:

<act_window name="Related Products" context="{'related_product':1}" res_model="product.product" src_model="product.product" view_mode="tree,form" key2="client_action_multi" id="action_related_products2"/>
其中:
context="{'related_product':1}"
定義了變量 related_product 的值為 1 ,后台代碼中引用變量的代碼如下所示:

from osv import osv, fields class product_product(osv.osv): _inherit = 'product.product' def search(self, cr, uid, args=None, offset=0, limit=None, order=None, context=None, count=False): if context is None: context = {} if context.get('related_product') and context.get('active_ids'): bom_obj = self.pool.get('mrp.bom') product_bom = bom_obj.search(cr,uid, [('product_id', 'in', context['active_ids'])]) parent_bom = [bom.bom_id.id for bom in bom_obj.browse(cr,uid, product_bom) if bom.bom_id.id] rel_ids = [bom.product_id.id for bom in bom_obj.browse(cr, uid, parent_bom)] args.append(('id', 'in', rel_ids)) return super(product_product, self).search(cr,uid,args,offset,limit, order,context=context, count=count) return super(product_product, self).search(cr,uid,args,offset,limit, order,context=context, count=count) product_product()
后台代碼中通過繼承並覆寫search方法,判斷 context 中變量 related_product 的值,共用產品視圖中實現了根據產品作為BOM的原料而生成的所有產品的的查詢(列表)。
5.在后台代碼中傳遞,context用於方法調用過程中變量的傳遞:
示例代碼:

#寫入,可用於校驗寫入和更改數據的合法性 def write(self, cr, uid, ids, vals, context=None): if context is None: context = {} if not context.get('set_to_draft', False): #非設置為草稿狀態的操作 for rec in self.browse(cr, uid, ids, context=context): if rec.state == 'draft' and rec.create_uid.id != uid: raise osv.except_osv(_(u'警告!'),_(u'您不能修改他人創建的單據.')) return super(dispatch_sale, self).write(cr, uid, ids, vals, context=context) #設置為草稿狀態 def set_to_draft(self, cr, uid, ids, context=None): ctx = context.copy() ctx['set_to_draft'] = True #用於在write方法中判斷是否是設置為草稿狀態的操作 return self.write(cr, uid, ids, {'state': 'draft'}, ctx)
其中:
set_to_draft 方法中定義了變量 ctx['set_to_draft'] = True 並作為參數傳遞到 write 中,
write 方法中判斷變量的值 if not context.get('set_to_draft', False) 執行響應的業務邏輯。