轉載請注明原文地址:https://www.cnblogs.com/ygj0930/p/10826430.html
搜索視圖
搜索視圖的search標簽本身沒什么屬性可以使用,只要是<search></search>標簽之間的內容定義了搜索動作。
1:field
field標簽定義了用於搜索過濾的字段有哪些。
searchview中的field字段只是說明了可以用哪些字段來作過濾,並且在搜索框輸入時會自動啟用搜索字段的模糊搜索功能以供候選。
可有以下幾種屬性,進一步指定使用某些字段的某些過濾條件進行記錄篩選:
- name -- 作為過濾條件的字段名
- string -- 字段的label
- operator -- 默認情況下field會生成[(name, operator, provided_value)]格式的表達式,其中name是字段名,provided_value是用戶提供的值,operator屬性可被重寫默認的運算符(默認情況下是根據字段類型分配,數字型是=,字符型是ilike)
- filter_domain -- 用於搜索的完整的domain表達式,可以用self變量來代表當前記錄的當前字段值,當operator和filter_domain同時賦值時,filter_domain有最高優先級
<field name="name" filter_domain="['|', '|', ('明確的字段內容', 'ilike', self), ('shortdesc', 'ilike', self), ('name', 'ilike', self)]" string="Theme"/>
- context -- 上下文的值。【具體用法:待研究】
- groups -- 使該字段只對某些用戶組可用。
- widget -- 使用指定的搜索部件(唯一的用例是V8的many2one字段選擇插件)
- domain -- 如果用於搜索的字段是 關聯字段,使用domain來過濾候選的搜索選項。
2:filter
過濾器,比filed字段更具體。searchview中的field字段只是說明了可以用哪些字段來作過濾,並且在搜索框輸入時會自動啟用搜索字段的模糊搜索功能以供候選;而filter則更加具體,它的domain屬性或context屬性,指明了具體的字段值過濾條件,符合條件的記錄才會作為最終搜索結果顯示出來。
- string (required) -- 過濾器的label
- domain -- 一個domain表達式,被添加到action的domain表達式中,作為搜索的domain表達式一部分,作用於最終的記錄過濾。
- context -- 一個python字典對象,被合並到action的domain表達式中,用於傳遞搜索的domain表達式的值
filter中的context,是dict類型。
a)傳遞分組依據:
context="{'group_by':'字段'}"
b)為domain表達式傳遞變量值
context="{'key':value}"
- name -- 過濾器的邏輯名【在action跳轉到搜索視圖時,可以在context中指明默認啟用哪個filter,就是通過name值來啟用的】
<record id="action_hr_timesheet_attendance_report" model="ir.actions.act_window"> <field name="context">{'search_default_過濾器name': True}</field> </record>
- help -- 過濾器的描述文字
- groups -- 指定過濾器可用的用戶組。
3:separator
分割線。用於將過濾器按組分開,更好看。
4:group
分局布局,用於過濾器比較多的情況下,分組排放。
5:默認搜索
搜索字段和過濾條件可以通過action的context使用search_default_name 配置,對於字段就是需要搜索的值,對過濾器它是一個布爾值:
{ 'search_default_foo': 'acro', 'search_default_bar': 1 } #自動激活bar過濾器,並在foo字段搜索acro
綜上,搜索視圖的過濾條件制定有2種方式:
1)通過filter的domain屬性。表達式的值:
a)可以是具體的明確值;
b)可以是python運算表達式(不過不能取具體記錄字段值,可以是python語言本身的一些庫函數調用的運算表達式)。
c)可以是一個變量名,變量值則通過context來賦予。一般用於制定默認搜索條件,在context中傳遞key:value。
<filter name="" string="" domain="[('字段', '比較運算符', 值[值可以是具體的明確值;也可以是python運算表達式(不過不能取具體記錄字段值,可以是python語言本身的一些庫函數調用的運算表達式)]))]"/>
2)通過action的domain字段:action中的domain表達式,會在跳轉時自動應用
<record id="action_" model="ir.actions.act_window"> <field name="name"></field> <field name="res_model"></field> <field name="domain">[(表達式)]</field> </record>
搜索條件的工作原理:
odoo模型中有個方法:read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
該方法用於讀取搜索視圖上的過濾條件,並使用過濾條件搜索模型記錄。
其中,domain是一個list,里面是一個個的表達式,由 action中的domain+fiter中的domain+界面上臨時應用的篩選條件 拼接而成。
工作流程為:
action打開tree視圖——調用模型的read_group()函數,根據domain條件,調用模型的search(domain)進行檢索——把記錄集返回界面上呈現;
每當界面上點擊了 篩選——過濾器 或 篩選——自定義篩選 ,都會調用一次read_group()函數,重新拼接domain列表,並檢索模型數據。【多維分析中也是該邏輯,不過是從sql查詢出來的view作為數據源,從中篩選數據】
【可以重寫模型的該方法,自定義記錄的篩選邏輯。】