- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
odoo-14.0.post20221212.tar 。
>>> self.env.context # 返回字典数据,等价于 self._context
{'lang': 'en_US', 'tz': 'Europe/Brussels'}
>>> self._context
{'lang': 'en_US', 'tz': 'Europe/Brussels'}
>>> recordSet.env.context # 注意,上下文是和记录集绑定的,上述的self也代表记录集
Model.with_context([context][, **overrides]) -> records[ 源代码] 。
返回附加到扩展上下文的此记录集的新版本.
扩展上下文是提供的合并了 overrides 的 context ,或者是合并了 overrides 当前 context 。
# current context is {'key1': True}
r2 = records.with_context({}, key2=True)
# -> r2._context is {'key2': True}
r2 = records.with_context(key2=True)
# -> r2._context is {'key1': True, 'key2': True}
需要注意的是,上下文是和记录集绑定的,修改后的上下文并不会在其它记录集中共享 。
为设置action打开的tree列表视图,添加默认搜索,搜索条件为 state 字段值等于 True 。
<?xml version="1.0"?>
<odoo>
<record id="link_estate_property_action" model="ir.actions.act_window">
<field name="name">Properties</field>
<field name="res_model">estate.property</field>
<field name="view_mode">tree,form</field>
<field name="context">{'search_default_state': True}</field>
</record>
<record id="estate_property_search_view" model="ir.ui.view">
<field name="name">estate.property.search</field>
<field name="model">estate.property</field>
<field name="arch" type="xml">
<search>
<!-- 搜索 -->
<field name="name" string="Title" />
<separator/>
<!-- 筛选 -->
<filter string="Available" name="state" domain="['|',('state', '=', 'New'),('state', '=', 'Offer Received')]"></filter>
</search>
</field>
</record>
<!--此处代码略...-->
</odoo>
说明:
<field name="context">{'search_default_fieldName': content}</field>
search_default_fieldName ,其中 fieldName 表示过滤器名称, 即搜索视图中定义的 <field> 、 <filter> 元素的 name 属性值 。
content 如果 fieldName 为搜索字段 <field> 的 name 属性值,那么 content 表示需要搜索的内容,输入内容是字符串,则需要添加引号,形如 'test' ;如果 fieldName 为搜索过滤器 <filter> 的 name 属性值,那么 content 表示布尔值,该值为真,则表示默认开启 name 所代表的过滤器,否则不开启.
<?xml version="1.0"?>
<odoo>
<!--此处代码略...-->
<record id="estate_property_search_view" model="ir.ui.view">
<field name="name">estate.property.search</field>
<field name="model">estate.property</field>
<field name="arch" type="xml">
<search>
<!-- 分组 -->
<group expand="1" string="Group By">
<filter string="朝向" name="garden_orientation" context="{'group_by':'garden_orientation'}"/>
</group>
</search>
</field>
</record>
<!--此处代码略...-->
</odoo>
说明: 'group_by': '分组字段名称' 。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from odoo import models, fields, api
class EstatePropertyType(models.Model):
_name = 'estate.property.type'
_description = 'estate property type'
name = fields.Char(string='name', required=True, help='help text')
property_ids = fields.One2many('estate.property', 'property_type_id')
offer_ids = fields.One2many('estate.property.offer', 'property_type_id')
offer_count = fields.Integer(compute='_compute_offer_count')
@api.depends('offer_ids.price')
def _compute_offer_count(self):
for record in self:
record.offer_count = len(record.mapped('offer_ids.price'))
@api.model
def action_confirm(self, *args):
print(self, self.env.context, args)
# ... do something else
<?xml version="1.0"?>
<odoo>
<!--此处代码略...-->
<record id="estate_property_type_view_form" model="ir.ui.view">
<field name="name">estate.property.type.form</field>
<field name="model">estate.property.type</field>
<field name="arch" type="xml">
<form string="Property Type">
<sheet>
<!--此处代码略...-->
<field name="offer_count">
<field name="property_ids">
<tree string="Properties">
<field name="name"/>
<field name="expected_price" string="Expected Price"/>
<field name="state" string="Status"/>
</tree>
</field>
<footer>
<button name="action_confirm" type="object" context="{'currentRecordID': active_id, 'offer_count':offer_count, 'property_ids': property_ids}" string="确认" class="oe_highlight"/>
</footer>
</sheet>
</form>
</field>
</record>
</odoo>
说明: context 属性值中的字典的键值如果为模型中定义的字段名称,则该字段名称必须以 <field> 元素的形式,出现在模型对应的视图(即不能是内联视图,比如内联Tree列表)中 ,否则会出现类似错误提示:
Field offer_count used in context.offerCount ({'offerCount': offer_count}) must be present in view but is missing.
点击界面按钮后,服务端打印日志如下 。
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) ,服务端控制台会收到类似如下告警(虽然点击按钮后,服务端不会抛异常):
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) ,则点击页面确认按钮时,服务端会报错误,如下:
TypeError: action_confirm2() takes 1 positional argument but 2 were given
<?xml version="1.0"?>
<odoo>
<!--此处代码略...-->
<record id="estate_property_view_form" model="ir.ui.view">
<field name="name">estate.property.form</field>
<field name="model">estate.property</field>
<field name="arch" type="xml">
<form string="estate property form">
<header>
<button name="%(action_demo_wizard)d" type="action"
string="选取offers" context="{'is_force':True}" class="oe_highlight"/>
<!--此处代码略...-->
</sheet>
</form>
</field>
</record>
</odoo>
传递数据给视图按钮 。
action_demo_wizard action关联视图设计 。
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data>
<!--此处代码略...-->
<record id="demo_wizard_view_form" model="ir.ui.view">
<field name="name">demo.wizard.form</field>
<field name="model">demo.wizard</field>
<field name="arch" type="xml">
<form>
<!--此处代码略...-->
<footer>
<button name="action_confirm" context="{'is_force':context.get('is_force')}" string="确认" class="oe_highlight"/>
<button string="关闭" class="oe_link" special="cancel"/>
</footer>
</form>
</field>
</record>
<!-- 通过动作菜单触发 -->
<record id="action_demo_wizard" model="ir.actions.act_window">
<field name="name">选取offers</field>
<field name="res_model">demo.wizard</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="binding_model_id" ref="estate.model_estate_property"/>
<field name="binding_view_types">form</field>
</record>
</data>
</odoo>
传递数据给视图关系字段 。
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data>
<!--此处代码略...-->
<record id="demo_wizard_view_form" model="ir.ui.view">
<field name="name">demo.wizard.form</field>
<field name="model">demo.wizard</field>
<field name="arch" type="xml">
<form>
<field name="offer_ids" context="{'is_force':context.get('is_force')}" >
<tree>
<!--此处代码略...-->
</tree>
</field>
<!--此处代码略...-->
</form>
</field>
</record>
<!-- 通过动作菜单触发 -->
<record id="action_demo_wizard" model="ir.actions.act_window">
<field name="name">选取offers</field>
<field name="res_model">demo.wizard</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="binding_model_id" ref="estate.model_estate_property"/>
<field name="binding_view_types">form</field>
</record>
</data>
</odoo>
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from odoo import models, fields
class EstateProperty(models.Model):
_name = 'estate.property'
_description = 'estate property table'
name = fields.Char(required=True)
property_type_id = fields.Many2one("estate.property.type", string="PropertyType", options="{'no_create_edit': True}")
offer_ids = fields.One2many("estate.property.offer", "property_id", string="PropertyOffer")
# ...此处代码略
# 重写父类read方法
def read(self, fields=None, load='_classic_read'):
print(self.env.context)
property_type_id = self.env.context.get('propertyTypeId')
if property_type_id:
print('do something you want')
return super(EstateProperty, self).read(fields, load)
<?xml version="1.0"?>
<odoo>
<!--此处代码略...-->
<record id="estate_property_type_view_form" model="ir.ui.view">
<field name="name">estate.property.type.form</field>
<field name="model">estate.property.type</field>
<field name="arch" type="xml">
<form string="Property Type">
<sheet>
<!--此处代码略...-->
<field name="property_ids" context="{'propertyTypeId': active_id}">
<tree string="Properties">
<field name="name"/>
</tree>
</field>
<!--此处代码略...-->
</sheet>
</form>
</field>
</record>
</odoo>
打开上述视图(即加载内联Tree视图)时,会自动调用 estate.property 模型的 read 方法,服务端控制台输出如下:
{'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}
do something you want
更多示例可参考文档:[odoo 为可编辑列表视图字段搜索添加查询过滤条件](odoo 为可编辑列表视图字段搜索添加查询过滤条件.md) 。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from odoo import models, fields,api
class EstatePropertyTag(models.Model):
_name = 'estate.property.tag'
_description = 'estate property tag'
name = fields.Char(string='tag', required=True)
color = fields.Integer(string='Color')
@api.model
def create(self, vals_list): # 通过重写模型的create或者write方法,调用该方法前修改上下文,然后在方法中通过self.env.context获取上下文中的目标key值,进而实现目标需求
res = super(EstatePropertyTag, self).create(vals_list)
# 获取上下文目标key值
if not self.env.context.get('is_sync', True):
# do something you need
return res
>>> self.env['estate.property.tag'].with_context(is_sync=False).create({'name': 'tag4', 'color': 4}).env.context
{'lang': 'en_US', 'tz': 'Europe/Brussels', 'is_sync': False}
https://www.odoo.com/documentation/14.0/zh_CN/developer/reference/addons/actions.html 。
最后此篇关于odoocontext上下文用法总结的文章就讲到这里了,如果你想了解更多关于odoocontext上下文用法总结的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
出现以下错误 Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable D
在调试应用程序时出现以下错误。 The CLR has been unable to transition from COM context 0x3b2d70 to COM context 0x3b2
在 GAE Go 中,为了记录,我们需要使用 appengine.NewContext(r) 创建一个新的上下文,它返回 context.Context。 如何使用此上下文在请求范围内设置/获取变量?
我想使用 Puppeteer 从放置在页面上 iframe 内的选择器中获取数据,该页面在与其父框架域不同的域上运行。因此,我不是任何域的所有者 - 无法使用 frame.postMessage。 试
我正在尝试获取可用的应用程序上下文并想切换到 webview 上下文,但 appium 仅获取 Navive App。 应用程序还启用了 WebView。 Appium 版本:1.10.1 Chrom
这个问题在这里已经有了答案: How to fix this nullOk error when using the flutter_svg package? (7 个回答) 7 个月前关闭。 当我尝
我观看了关于 Core Data 的 2016 WWDC 视频并查看了各种教程。我见过使用 Core Data Framework 创建对象以持久保存到 managedObjectContext 中的
这是代码 obj = { a: 'some value'; m: function(){ alert(this.a); } } obj.m(); 结果是'som
我正在尝试做类似的事情 $(".className").click(function() { $(this).(".anotherClass").css("z-index","1");
var User = { Name: "Some Name", Age: 26, Show: function() { alert("Age= "+this.Age)}; }; fun
我目前正在使用我见过的常见 Context 模式,它允许子组件通过传递修饰函数来更新父组件的状态(即 Provider)通过共享的 Context。 我遇到的问题是,修改函数只引用原始状态,不引用最新
有没有办法让 React Context类型安全与流类型? 例如: Button.contextTypes = { color: React.PropTypes.string }; 最佳答案 不幸
我想知道是否有一种方法可以为不同的功能使用不同的上下文类。 我希望有一个功能使用 MinkExtensions 进行浏览器测试,另一个功能使用和 HTTP 客户端(如 Guzzle)进行 API 测试
我有这个配置文件 apiVersion: v1 clusters: - cluster: server: [REDACTED] // IP of my cluster name: stag
我在实现非抢先式调度时遇到了用于初始化TCB的代码。 typedef struct TCB_t { struct TCB_t *next; struct TCB_t
我想将一个函数设置为数组中每个元素的属性,但使用不同的参数调用它。我想我会使用匿名函数来解决它: for ( var i = 0; i < object_count; i++ ) { obje
这个问题已经有答案了: How to access the correct `this` inside a callback (15 个回答) 已关闭 7 年前。 我正在做一些练习,但我在管道方法中丢
我正在尝试通过 Java 和 Android Studio 学习和制作 Android 应用程序。我对Java的了解程度是两年前几个小时的youtube学习和大学基础类(class)。不过我确实知道如
我在(这个)上遇到了问题。错误ImageView无法应用。我在 fragment 类中执行此代码。 ViewFlipper v_flipper; @Nullable @Override public
我想使用 openGL 的某些功能,但与渲染视觉内容无关。有没有办法在没有任何依赖性的情况下创建它(不是对 Windows,也不是某些包[SDL,SFML,GLUT])?只允许使用没有外部库的库,就像
我是一名优秀的程序员,十分优秀!