odoo context上下文用法總結

来源:https://www.cnblogs.com/shouke/archive/2023/03/05/17135902.html
-Advertisement-
Play Games

環境 odoo-14.0.post20221212.tar context用法總結 獲取上下文 >>> self.env.context # 返回字典數據,等價於 self._context {'lang': 'en_US', 'tz': 'Europe/Brussels'} >>> self._c ...


環境

odoo-14.0.post20221212.tar

context用法總結

獲取上下文

>>> 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[源代碼]

返回附加到擴展上下文的此記錄集的新版本。

擴展上下文是提供的合併了overridescontext,或者是合併了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,為關聯視圖添加預設搜索、過濾條件

視圖定義

為設置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

作者:授客
微信/QQ:1033553122
全國軟體測試QQ交流群:7156436

Git地址:https://gitee.com/ishouke
友情提示:限於時間倉促,文中可能存在錯誤,歡迎指正、評論!
作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額隨意,您的支持將是我繼續創作的源動力,打賞後如有任何疑問,請聯繫我!!!
           微信打賞                        支付寶打賞                  全國軟體測試交流QQ群  
              


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Canvas var canvas = document.querySelector('.myCanvas'); var width = canvas.width = window.innerWidth; var height = canvas.height = window.innerHeight ...
  • 離職在家 閑來無事看最近ChatGPT很火 花了一天時間 用Uniapp寫了一個小程式端的ChatGPT,實在是看不慣~ 一大堆利用ChatGPT收費的應用(小程式) 整個開源的玩玩 另外主要是自己本身是後端開發人員~ 剛好用uniapp實踐一下小程式開發 先看看主頁面效果圖吧 演示視頻-> 做一個 ...
  • 前言 用數據生成CAD圖,一般採用的ObjectArx對CAD二次開發完成。ObjectARX是AutoDesk公司針對AutoCAD平臺上的二次開發而推出的一個開發軟體包,它提供了以C++為基礎的面向對象的開發環境及應用程式介面,能訪問和創建AutoCAD圖形資料庫。而由於現在懂C++的人少,很多 ...
  • 這篇文章主要描述如何進行消息隊列產品選型,包括產品選型需要考慮的因素、三種比較流行的消息隊列產品的優缺點以及如何根據我們的使用場景選擇合適的消息隊列產品。 ...
  • OneAPM 摘要:此篇文章主要介紹Java8 Lambda 表達式產生的背景和用法,以及 Lambda 表達式與匿名類的不同等。本文系OneAPM工程師編譯整理。 Java是一流的面向對象語言,除了部分簡單數據類型,Java 中的一切都是對象,即使數組也是一種對象,每個類創建的實例也是對象。在 J ...
  • 在企業的商業活動中,訂單是指交易雙方的產品或服務交易意向。交易下單負責創建這個交易雙方的產品或服務交易意向,有了這個意向後,買方可以付款,賣方可以發貨。 在電商場景下,買賣雙方沒有面對面交易,許多情況下需要通過超時處理自動關閉訂單 ...
  • 1. 編譯閾值 1.1. 一旦代碼執行到一定次數,就達到了它的編譯閾值,編譯器就會認為它有足夠的信息來編譯代碼 1.2. 在當前的JVM中,優化閾值的意義不大 1.2.1. 從JDK 7以及更早期遺留下來的 1.3. -XX:CompileThreshold=N 1.3.1. 當禁用分層編譯時有效 ...
  • 0. RSocket 簡介 採用二進位點對點數據傳輸,主要應用於分散式架構之中,是一種基於Reactive Stream規範標準實現的新的通信協議。 參考阿裡雲開發者社區的介紹 相關文檔和資料: RSocket By Example rsocket-java 原生庫例子 Spring RSocket ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...