翼度科技»论坛 编程开发 python 查看内容

odoo context上下文用法总结

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
环境

odoo-14.0.post20221212.tar
context用法总结

获取上下文
  1. >>> self.env.context # 返回字典数据,等价于 self._context
  2. {'lang': 'en_US', 'tz': 'Europe/Brussels'}
  3. >>> self._context
  4. {'lang': 'en_US', 'tz': 'Europe/Brussels'}
  5. >>> recordSet.env.context  # 注意,上下文是和记录集绑定的,上述的self也代表记录集
复制代码
设置上下文

Model.with_context([context][, **overrides]) -> records[源代码]
返回附加到扩展上下文的此记录集的新版本。
扩展上下文是提供的合并了overrides的context,或者是合并了overrides当前context
  1. # current context is {'key1': True}
  2. r2 = records.with_context({}, key2=True)
  3. # -> r2._context is {'key2': True}
  4. r2 = records.with_context(key2=True)
  5. # -> r2._context is {'key1': True, 'key2': True}
复制代码
需要注意的是,上下文是和记录集绑定的,修改后的上下文并不会在其它记录集中共享
应用场景示例

用于action,为关联视图添加默认搜索、过滤条件

视图定义

为设置action打开的tree列表视图,添加默认搜索,搜索条件为 state字段值等于True
  1. <?xml version="1.0"?>
  2. <odoo>
  3.     <record id="link_estate_property_action" model="ir.actions.act_window">
  4.         <field name="name">Properties</field>
  5.         <field name="res_model">estate.property</field>
  6.         <field name="view_mode">tree,form</field>
  7.         <field name="context">{'search_default_state': True}</field>
  8.     </record>
  9.     <record id="estate_property_search_view" model="ir.ui.view">
  10.         <field name="name">estate.property.search</field>
  11.         <field name="model">estate.property</field>
  12.         <field name="arch" type="xml">
  13.             <search>
  14.                
  15.                 <field name="name" string="Title" />               
  16.                 <separator/>
  17.                
  18.                 <filter string="Available" name="state" domain="['|',('state', '=', 'New'),('state', '=', 'Offer Received')]"></filter>               
  19.             </search>
  20.         </field>
  21.     </record>
  22.    
  23. </odoo>
复制代码
说明:
  1. <field name="context">{'search_default_fieldName': content}</field>
复制代码
search_default_fieldName,其中fieldName  表示过滤器名称,即搜索视图中定义的、元素的name属性值
content  如果fieldName为搜索字段的name属性值,那么content表示需要搜索的内容,输入内容是字符串,则需要添加引号,形如'test';如果fieldName为搜索过滤器的name属性值,那么content表示布尔值,该值为真,则表示默认开启name所代表的过滤器,否则不开启。
用于搜索视图,添加分组查询条件

视图设计
  1. <?xml version="1.0"?>
  2. <odoo>
  3.    
  4.     <record id="estate_property_search_view" model="ir.ui.view">
  5.         <field name="name">estate.property.search</field>
  6.         <field name="model">estate.property</field>
  7.         <field name="arch" type="xml">
  8.             <search>                              
  9.                
  10.                 <group expand="1" string="Group By">
  11.                     <filter string="朝向" name="garden_orientation" context="{'group_by':'garden_orientation'}"/>
  12.                 </group>
  13.             </search>
  14.         </field>
  15.     </record>
  16.    
  17. </odoo>
复制代码
说明:'group_by': '分组字段名称'
用于视图对象按钮,传递数据给模型方法

模型设计
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. from odoo import models, fields, api
  4. class EstatePropertyType(models.Model):
  5.     _name = 'estate.property.type'
  6.     _description = 'estate property type'
  7.     name = fields.Char(string='name', required=True, help='help text')
  8.     property_ids = fields.One2many('estate.property', 'property_type_id')
  9.     offer_ids = fields.One2many('estate.property.offer', 'property_type_id')
  10.     offer_count = fields.Integer(compute='_compute_offer_count')
  11.     @api.depends('offer_ids.price')
  12.     def _compute_offer_count(self):
  13.         for record in self:
  14.             record.offer_count = len(record.mapped('offer_ids.price'))
  15.    
  16.     @api.model
  17.     def action_confirm(self, *args):
  18.         print(self, self.env.context, args)
  19.         # ... do something else
复制代码
视图设计
  1. <?xml version="1.0"?>
  2. <odoo>
  3.    
  4.     <record id="estate_property_type_view_form" model="ir.ui.view">
  5.         <field name="name">estate.property.type.form</field>
  6.         <field name="model">estate.property.type</field>
  7.         <field name="arch" type="xml">
  8.             <form string="Property Type">
  9.                 <sheet>
  10.                     
  11.                     <field name="offer_count">
  12.                     <field name="property_ids">
  13.                         <tree string="Properties">
  14.                             <field name="name"/>
  15.                             <field name="expected_price" string="Expected Price"/>
  16.                             <field name="state" string="Status"/>
  17.                         </tree>
  18.                     </field>
  19.                     <footer>
  20.                        <button name="action_confirm" type="object" context="{'currentRecordID': active_id, 'offer_count':offer_count, 'property_ids': property_ids}" string="确认" />
  21.                     </footer>
  22.                 </sheet>
  23.             </form>
  24.         </field>
  25.     </record>
  26. </odoo>
复制代码
说明:context属性值中的字典的键值如果为模型中定义的字段名称,则该字段名称必须以元素的形式,出现在模型对应的视图(即不能是内联视图,比如内联Tree列表)中,否则会出现类似错误提示:
  1. Field offer_count used in context.offerCount ({'offerCount': offer_count}) must be present in view but is missing.
复制代码
点击界面按钮后,服务端打印日志如下
  1. estate.property.type() {'lang': 'en_US', 'tz': 'Europe/Brussels', 'uid': 2, 'allowed_company_ids': [1], 'params': {'action': 165, 'cids': 1, 'id': 1, 'menu_id': 70, 'model': 'estate.property.type', 'view_type': 'form'}, 'currentRecordID': 1, 'offer_count': 4, 'property_ids': [[4, 49, False], [4, 48, False]]} ([1],)
复制代码
说明:args 从日志来看,args接收了当前记录ID
注意:

  • 如果将def action_confirm(self, *args) 改成def action_confirm(self, arg),服务端控制台会收到类似如下告警(虽然点击按钮后,服务端不会抛异常):
    1. 2023-02-06 01:28:53,848 28188 WARNING odoo odoo.addons.base.models.ir_ui_view: action_confirm on demo.wizard has parameters and cannot be called from a button
    复制代码
  • 如果将def action_confirm(self, *args)改成def action_confirm(self),则点击页面确认按钮时,服务端会报错误,如下:
    1. TypeError: action_confirm2() takes 1 positional argument but 2 were given
    复制代码
用于视图动作按钮,传递数据给动作关联的视图

视图设计
  1. <?xml version="1.0"?>
  2. <odoo>   
  3.    
  4.     <record id="estate_property_view_form" model="ir.ui.view">
  5.         <field name="name">estate.property.form</field>
  6.         <field name="model">estate.property</field>
  7.         <field name="arch" type="xml">
  8.             <form string="estate property form">
  9.                 <header>
  10.                     <button name="%(action_demo_wizard)d" type="action"
  11.                     string="选取offers" context="{'is_force':True}" />
  12.                         
  13.                 </sheet>
  14.             </form>
  15.         </field>
  16.     </record>     
  17. </odoo>
复制代码
传递数据给视图按钮
action_demo_wizard action关联视图设计
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <odoo>
  3.     <data>
  4.          
  5.         <record id="demo_wizard_view_form" model="ir.ui.view">
  6.             <field name="name">demo.wizard.form</field>
  7.             <field name="model">demo.wizard</field>
  8.             <field name="arch" type="xml">
  9.                 <form>                     
  10.                      
  11.                     <footer>                        
  12.                        <button name="action_confirm" context="{'is_force':context.get('is_force')}" string="确认" />
  13.                         <button string="关闭"  special="cancel"/>
  14.                     </footer>
  15.                 </form>
  16.             </field>
  17.         </record>
  18.         
  19.         <record id="action_demo_wizard" model="ir.actions.act_window">
  20.             <field name="name">选取offers</field>
  21.             <field name="res_model">demo.wizard</field>
  22.             <field name="type">ir.actions.act_window</field>
  23.             <field name="view_mode">form</field>
  24.             <field name="target">new</field>
  25.             <field name="binding_model_id" ref="estate.model_estate_property"/>
  26.             <field name="binding_view_types">form</field>
  27.         </record>      
  28.     </data>
  29. </odoo>
复制代码
传递数据给视图关系字段
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <odoo>
  3.     <data>
  4.          
  5.         <record id="demo_wizard_view_form" model="ir.ui.view">
  6.             <field name="name">demo.wizard.form</field>
  7.             <field name="model">demo.wizard</field>
  8.             <field name="arch" type="xml">
  9.                 <form>
  10.                     <field name="offer_ids" context="{'is_force':context.get('is_force')}" >
  11.                         <tree>                           
  12.                              
  13.                         </tree>
  14.                     </field>
  15.                                           
  16.                 </form>
  17.             </field>
  18.         </record>
  19.         
  20.         <record id="action_demo_wizard" model="ir.actions.act_window">
  21.             <field name="name">选取offers</field>
  22.             <field name="res_model">demo.wizard</field>
  23.             <field name="type">ir.actions.act_window</field>
  24.             <field name="view_mode">form</field>
  25.             <field name="target">new</field>
  26.             <field name="binding_model_id" ref="estate.model_estate_property"/>
  27.             <field name="binding_view_types">form</field>
  28.         </record>      
  29.     </data>
  30. </odoo>
复制代码
用于视图关系字段,传递数据给模型方法

模型设计
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from odoo import models, fields
  4. class EstateProperty(models.Model):
  5.     _name = 'estate.property'
  6.     _description = 'estate property table'
  7.     name = fields.Char(required=True)
  8.     property_type_id = fields.Many2one("estate.property.type", string="PropertyType", options="{'no_create_edit': True}")
  9.     offer_ids = fields.One2many("estate.property.offer", "property_id", string="PropertyOffer")
  10.    
  11.     # ...此处代码略  
  12.     # 重写父类read方法
  13.     def read(self, fields=None, load='_classic_read'):
  14.         print(self.env.context)
  15.         property_type_id = self.env.context.get('propertyTypeId')
  16.         if property_type_id:
  17.             print('do something you want')
  18.         return super(EstateProperty, self).read(fields, load)   
复制代码
视图设计
  1. <?xml version="1.0"?>
  2. <odoo>
  3.    
  4.     <record id="estate_property_type_view_form" model="ir.ui.view">
  5.         <field name="name">estate.property.type.form</field>
  6.         <field name="model">estate.property.type</field>
  7.         <field name="arch" type="xml">
  8.             <form string="Property Type">
  9.                 <sheet>
  10.                     
  11.                     <field name="property_ids" context="{'propertyTypeId': active_id}">
  12.                         <tree string="Properties">
  13.                             <field name="name"/>
  14.                         </tree>
  15.                     </field>
  16.                     
  17.                 </sheet>
  18.             </form>
  19.         </field>
  20.     </record>
  21. </odoo>
复制代码
打开上述视图(即加载内联Tree视图)时,会自动调用estate.property模型的read方法,服务端控制台输出如下:
  1. {'lang': 'en_US', 'tz': 'Europe/Brussels', 'uid': 2, 'allowed_company_ids': [1], 'params': {'action': 165, 'cids': 1, 'id': 1, 'menu_id': 70, 'model': 'estate.property.type', 'view_type': 'form'}, 'propertyTypeId': 1}
  2. do something you want
复制代码
更多示例可参考文档:[odoo 为可编辑列表视图字段搜索添加查询过滤条件](odoo 为可编辑列表视图字段搜索添加查询过滤条件.md)
用于记录集,传递数据给模型方法

模型设计
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. from odoo import models, fields,api
  4. class EstatePropertyTag(models.Model):
  5.     _name = 'estate.property.tag'
  6.     _description = 'estate property tag'
  7.     name = fields.Char(string='tag', required=True)
  8.     color = fields.Integer(string='Color')
  9.     @api.model
  10.     def create(self, vals_list): # 通过重写模型的create或者write方法,调用该方法前修改上下文,然后在方法中通过self.env.context获取上下文中的目标key值,进而实现目标需求
  11.         res = super(EstatePropertyTag, self).create(vals_list)
  12.         # 获取上下文目标key值
  13.         if not self.env.context.get('is_sync', True):
  14.             # do something you need
  15.         return res
复制代码
  1. >>> self.env['estate.property.tag'].with_context(is_sync=False).create({'name': 'tag4', 'color': 4}).env.context
  2. {'lang': 'en_US', 'tz': 'Europe/Brussels', 'is_sync': False}
复制代码
参考连接

https://www.odoo.com/documentation/14.0/zh_CN/developer/reference/addons/actions.html

来源:https://www.cnblogs.com/shouke/p/17135902.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具